All posts

Netdata on a VPS: what 3 percent CPU buys you

Netdata Agent v2.12.3 on Docker: quiet-window median 3.39% CPU, ~90 MiB VmRSS, ~137 MiB docker mem, UI bound to 127.0.0.1:19999.

Written by NodeRings Inc.

NodeRings Inc. writes these notes. The company runs the marketplace and the agent that stays on the provider’s side of the hypervisor.

Netdata Agent v2.12.3 (netdata/netdata:stable, digest sha256:c7eab00e20901eb60595ebae0fbfe88e59464e663924461874719d40de0735d2) sat on this host with a quiet-window median of 3.39% CPU in docker stats (30 samples, 3 seconds apart). p95 was 3.69%. One sample peaked at 8.74%. Process VmRSS median was about 90.5 MiB; docker reported about 137 MiB. The dashboard listened on 127.0.0.1:19999 only. Cloud claim stayed unset (claim_id null in /api/v1/info).

That is roughly the “~3% CPU” line people quote when they install Netdata. On this quiet box it held.

ReadingValue
Imagenetdata/netdata:stable → v2.12.3
CPU median / p95 / max3.39% / 3.69% / 8.74%
VmRSS median~90.5 MiB
docker mem median~137 MiB
Listener127.0.0.1:19999
Bar chart of Netdata quiet-window CPU median 3.39 percent, p95 3.69 percent, and memory about 90 to 137 MiB.
Quiet host, host network, private UI. Browsing charts will move the needle.

What you are paying for

Per-second charts for CPU, RAM, disk, network, and containers, plus the Agent’s collectors and built-in health checks. Beszel is the thinner hub/agent graph on this site. Uptime Kuma watches URLs and keywords. Netdata is the always-on host microscope: more collectors, more RAM, and a steady few percent of a core while nothing special is happening.

Install with host visibility and a private UI

Official Docker guidance uses host PID/network and read-only host mounts so cgroups and apps show up. This lab followed that shape, then locked the web server to loopback.

# compose.yaml (lab)
services:
  netdata:
    image: netdata/netdata:stable
    container_name: netdata
    pid: host
    network_mode: host
    restart: unless-stopped
    cap_add:
      - SYS_PTRACE
      - SYS_ADMIN
    security_opt:
      - apparmor:unconfined
    volumes:
      - ./config:/etc/netdata
      - ./lib:/var/lib/netdata
      - ./cache:/var/cache/netdata
      - /:/host/root:ro,rslave
      - /etc/passwd:/host/etc/passwd:ro
      - /etc/group:/host/etc/group:ro
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /etc/os-release:/host/etc/os-release:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
docker compose up -d
# after first start, pin the UI:
# config/netdata.conf → [web] / bind to = 127.0.0.1
docker compose restart
[web]
    bind to = 127.0.0.1
curl -s http://127.0.0.1:19999/api/v1/info | jq '.version,.cores_total'
# "v2.12.3"
# "8"

ss -ltnp | grep 19999
# LISTEN 127.0.0.1:19999 …

Host networking means the Agent sees the real interfaces; bind to is what keeps strangers off the dashboard. Put Caddy in front when you need a hostname. Leave Netdata Cloud claim tokens empty until you want that path.

compose.yaml freeze with host pid/network and host mounts for Netdata.
Host mounts buy cgroup visibility. Loopback bind keeps the UI private.

How the quiet window was measured

Thirty docker stats --no-stream samples on the netdata container, three seconds apart, while nobody was clicking charts. CPU% from docker, memory from docker, and VmRSS from /proc/<pid>/status for the main netdata process. No load generator. One later curl of / left the median story alone (CPU still ~3.4%).

StatQuiet window
Samples30 × 3 s
CPU median3.39%
CPU mean3.61%
CPU p953.69%
CPU max8.74%
docker mem median137.1 MiB
VmRSS median90.5 MiB
JSON-style freeze of Netdata CPU median 3.39 percent and memory medians.
docker stats CPU% is relative to the host; on an 8-vCPU box this is a thin slice.
curl api/v1/info showing v2.12.3 and ss listening on 127.0.0.1:19999.
Version check and loopback proof.

When the percentage climbs

Opening dense charts, enabling more collectors, or pointing many child Agents at one parent will spend more CPU than a quiet window. The title’s “3 percent” is a quiet-host check. A busy UI session will sit higher. If you need a hard ceiling, systemd/docker CPU quotas work; measure first so you know what you are capping.

Notes on per-second charts, collectors, and how Netdata differs from Beszel and Uptime Kuma.
Rich default charts are the product. That is why the Agent costs a few percent.

Pick on a small VPS

NeedLean
Deep host graphs, accept ~3–4% quiet CPUNetdata
Thinner hub + agent RSS storyBeszel
HTTP / keyword / status pageUptime Kuma
Cron heartbeatsHealthchecks
Decision notes: Netdata for deep graphs, Beszel for thinner RSS, Kuma for URL checks.
Same monitoring shelf, different jobs.
Skip thisWhat this lab did
Publishing 19999 on 0.0.0.0bind to = 127.0.0.1
Claiming to Cloud on day one unreadLeft claim tokens empty
Treating marketing “1%” as measuredSampled docker stats for ~90 s
Bridge-only install while expecting full host cgroupsHost pid/network + /host/proc
Alerting only from the dashboard tabUse health + ntfy/Kuma if you need push

What Netdata’s own sizing pages say

Netdata’s resource docs put a Child/standalone agent with defaults at about 1–5% of one CPU core, including per-second collection, database tiers, alerts, optional ML, and streaming to a Parent. Empty cloud VMs in their impact notes often sit near 100–200 MB RAM and a few KiB/s of disk I/O; production boxes with more collectors land nearer 250–350 MB and 5–20% of one core. Rare flush spikes can touch ~20% for a moment every fifteen minutes or so.

The knobs that move the bill are metric count, update every (raising from 1s toward 2s roughly halves collection CPU), database tiers/retention (~4 GiB of metrics+metadata is a common default footprint), and machine learning. Parent agents that ingest many Children scale with samples per second, not with “one more dashboard.” If this lab’s quiet percentage looked lower than a busy production host, that is expected: fewer collectors and a short quiet window. Trim collectors and retention before you blame the VPS size.

FAQ

Is docker CPU% the same as top? Close enough for sizing. docker aggregates the container; VmRSS is the main Agent process. Quote both if someone argues.

Do I need privileged mode? This compose uses specific capabilities and AppArmor unconfined instead of privileged: true. Match current Netdata Docker docs if your kernel complains.

Parent/child streaming? A different RAM/CPU profile. This post is one Agent on one VPS.

Will 1 GB RAM hold it? ~137 MiB docker mem leaves room next to a small app stack. Still bind loopback and watch the quiet median after install.

What to run on the VPS

On a 1–2 GB Compute Instance, pin netdata/netdata by digest, use host mounts if you want container charts, set bind to = 127.0.0.1, and re-sample docker stats after a day of real use. Keep the UI behind SSH or Caddy. If a few percent of a core feels high for the charts you actually open, switch to Beszel and keep Netdata for the box that needs the microscope.