Skip to main content
The resource advisor reads the usage history the platform already keeps on each server and turns it into plain suggestions. It tells you which containers need a memory limit, which limits are too tight or far too generous, which apps sit idle, how to size Postgres for the memory it has, and when a disk will fill. It never changes anything on its own. You apply a suggestion by opening it, reviewing the before and after, and confirming. It is deterministic: the same history always gives the same findings, and no AI model is involved. The AI assistant and the MCP server can read the findings through the resource_advice tool, but the advisor works fine with no AI configured.

Turn it on

The advisor is off by default. Turn it on in Settings, Beta features, or from the CLI:
APP_EXPERIMENTAL=resource-advisor on the control plane turns it on too, and then Settings cannot turn it off. While it is off, the advisor’s routes answer 404 with "code": "experimental_feature_disabled", its page, navigation entry, dashboard tile and Optimise findings are hidden, and the attention feed carries no advice. The MCP server reads its own environment, so set APP_EXPERIMENTAL=resource-advisor there to expose the resource_advice tool.

Where it shows up

  • Infrastructure, Resource advisor: every finding, grouped by resource or ordered by estimated saving, with a summary of warnings, applicable changes and memory to reclaim.
  • Resources tab of an app or database: the Optimise panel lists that resource’s findings. The evidence is collapsed (usage against the limit, the p95 line and the suggested value), and there is a Review and apply button. The cost comparison sits underneath, also collapsed. With the beta off, the panel shows the plain limit suggestion instead.
  • Overview of an app or database: one line pointing at the Optimise panel when there is advice.
  • Dashboard: a summary tile linking to the advisor page.
  • Attention feed: each warning is its own item, and suggestions come as one roll-up marked as recommendations rather than incidents.

Apply, dismiss and snooze

The advisor can apply only three kinds of action: set a memory limit, set a CPU limit, and turn on sleep when idle. Everything else (engine tuning, consolidation, disk cleanup) comes with instructions you follow yourself.
POST /api/v1/resource-advisor/findings/{id}/apply without {"confirm": true} returns a preview (before, after, confirm_required: true) and changes nothing. With confirm, the limit is saved to the desired state and, when the container is running, applied to it live; otherwise it takes effect on the next start. If the setting changed after the suggestion was made, apply answers 409 and asks you to review again rather than overwrite your change. Dismiss hides a finding until you restore it. Snooze hides it for a while (7 days by default, at most 90). Both are stored per finding and everyone on the instance sees the same result.

Who sees what

Reading findings needs the read ability. Findings are filtered to the apps and databases the caller can read, including team scope and IAM visibility. Server-level findings (disk, host memory, consolidation) need root. Applying, dismissing or snoozing needs write on the route and on the resource itself; turning on sleep when idle needs deploy on the app. Switching the beta needs root.

How each rule works

Every rule needs at least APP_RESOURCE_ADVISOR_MIN_DATA (24 hours) of history for the resource. With less, the advisor says “Not enough data yet” and suggests nothing. Suggested limits round up to sensible steps: memory to 64, 96, 128, 192, 256, 384, 512, 768 MiB, 1, 1.5, 2 GiB and then 512 MiB steps; CPU to 0.1, 0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4 cores and then whole cores. A CPU suggestion is never below 0.1 core. The same rounding is used by the plain limit suggestion (resource-recommendation), so both always agree.

Engine tuning values

For Postgres, with memory M (the limit, or the suggested limit):
  • shared_buffers: M / 4
  • effective_cache_size: 3M / 4
  • max_connections: 50 below 1 GiB, 100 below 4 GiB, 200 above
  • work_mem: (M minus shared_buffers) / (max_connections times 3), between 1 MB and 64 MB
  • maintenance_work_mem: M / 16, or M / 4 for pgvector so HNSW and IVFFlat index builds fit in memory
Apply them with ALTER SYSTEM SET and SELECT pg_reload_conf(); (shared_buffers and max_connections need a restart). For Redis and KeyDB the advisor suggests maxmemory at three quarters of M and an eviction policy (allkeys-lru for a cache, noeviction for queues or primary data). For MySQL and MariaDB it suggests innodb_buffer_pool_size at about half of M, in 128 MB chunks.

Thresholds

Every threshold has an env var on the control plane. A value that does not parse keeps its default and is logged. The analysis runs on request and is cached for the TTL. The one Docker call (reclaimable disk) is bounded to 2 seconds and skipped when it times out. The attention feed reads only the cache and refreshes it in the background, so it never waits for an analysis.

What this does not know

  • Your traffic plan. It sees the last week, not next week’s launch or a monthly batch job. A limit sized from a quiet week can be too small for a busy one.
  • Connections. It does not measure database connection counts. A database counts as unused only when no app links to it, which the advisor learns from managed references, attachments and plain env values. An app that holds the connection string in a secret makes links unknown, and then no database is flagged as unused.
  • Current engine settings. The advisor cannot read shared_buffers or maxmemory from inside the database. Tuning values assume image defaults; check yours with SHOW or CONFIG GET before applying.
  • Short spikes in older history. A week of history is read from hourly averages once raw samples age out, so a spike shorter than an hour is smoothed. Limits keep headroom above the highest hourly peak for that reason.
  • Per-database volume size. Disk forecasting is per server, not per database volume.
  • Remote servers’ host memory and swap. Host memory, swap and disk are recorded for the control plane’s own server only; remote nodes report container usage but not host capacity yet.
  • Requests that bypass the proxy. Idle detection counts requests through the built-in proxy. Traffic straight to a published port or through another proxy is invisible to it.
  • Whether a change is safe for your app. A CPU cap can slow a startup that bursts; a lower memory limit can kill a job that peaks rarely. Read the evidence and the risk line before applying.

API

Findings carry kind, severity (info, suggest, warn), resource, title, why, evidence (window, sample count, p50, p95, p99, peak, limit and, when filtered to one resource, an hourly series), impact (estimated saving, exhaustion time, risk) and action. Finding ids are stable (kind:resource), so a dismissal survives refreshes.
Last modified on October 12, 2026