The only agent that thinks for itself

Autonomous Monitoring with self-learning AI built-in, operating independently across your entire stack.

Unlimited Metrics & Logs
Machine learning & MCP
5% CPU, 150MB RAM
3GB disk, >1 year retention
800+ integrations, zero config
Dashboards, alerts out of the box
> Discover Netdata Agents

Centralized metrics streaming and storage

Aggregate metrics from multiple agents into centralized Parent nodes for unified monitoring across your infrastructure.

Stream from unlimited agents
Long-term data retention
High availability clustering
Data replication & backup
Scalable architecture
Enterprise-grade security
> Learn about Parents

Fully managed cloud platform

Access your monitoring data from anywhere with our SaaS platform. No infrastructure to manage, automatic updates, and global availability.

Zero infrastructure management
99.9% uptime SLA
Global data centers
Automatic updates & patches
Enterprise SSO & RBAC
SOC2 & ISO certified
> Explore Netdata Cloud

Deploy Netdata Cloud in your infrastructure

Run the full Netdata Cloud platform on-premises for complete data sovereignty and compliance with your security policies.

Complete data sovereignty
Air-gapped deployment
Custom compliance controls
Private network integration
Dedicated support team
Kubernetes & Docker support
> Learn about Cloud On-Premises

Powerful, intuitive monitoring interface

Modern, responsive UI built for real-time troubleshooting with customizable dashboards and advanced visualization capabilities.

Real-time chart updates
Customizable dashboards
Dark & light themes
Advanced filtering & search
Responsive on all devices
Collaboration features
> Explore Netdata UI

Monitor on the go

Native iOS and Android apps bring full monitoring capabilities to your mobile device with real-time alerts and notifications.

iOS & Android apps
Push notifications
Touch-optimized interface
Offline data access
Biometric authentication
Widget support
> Download apps

The future of infrastructure observability

See our strategic direction across AI-native observability, full-stack signals, operational intelligence, and enterprise platform maturity.

AI-native observability
Full-stack signal coverage
Operational intelligence
Enterprise platform maturity
Agent releases every 6 weeks
Cloud continuous delivery
> Explore Product Roadmap

Best energy efficiency

True real-time per-second

100% automated zero config

Centralized observability

Multi-year retention

High availability built-in

Zero maintenance

Always up-to-date

Enterprise security

Complete data control

Air-gap ready

Compliance certified

Millisecond responsiveness

Infinite zoom & pan

Works on any device

Native performance

Instant alerts

Monitor anywhere

AI-native observability

Continuous delivery

Open source foundation

80% Faster Incident Resolution

AI-powered troubleshooting from detection, to root cause and blast radius identification, to reporting.

True Real-Time and Simple, even at Scale

Linearly and infinitely scalable full-stack observability, that can be deployed even mid-crisis.

90% Cost Reduction, Full Fidelity

Instead of centralizing the data, Netdata distributes the code, eliminating pipelines and complexity.

See and Map Your Entire Network

Live topology, flow analytics, and SNMP device and trap monitoring — unified with your full-stack observability.

Control Without Surrender

SOC 2 Type 2 certified with every metric kept on your infrastructure.

Integrations

800+ collectors and notification channels, auto-discovered and ready out of the box.

800+ data collectors
Auto-discovery & zero config
Cloud, infra, app protocols
Notifications out of the box
> Explore integrations
Real Results
46% Cost Reduction

Reduced monitoring costs by 46% while cutting staff overhead by 67%.

— Leonardo Antunez, Codyas

Zero Pipeline

No data shipping. No central storage costs. Query at the edge.

From Our Users
"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

No Query Language

Point-and-click troubleshooting. No PromQL, no LogQL, no learning curve.

Enterprise Ready
67% Less Staff, 46% Cost Cut

Enterprise efficiency without enterprise complexity—real ROI from day one.

— Leonardo Antunez, Codyas

SOC 2 Type 2 Certified

Zero data egress. Only metadata reaches the cloud. Your metrics stay on your infrastructure.

Full Coverage
800+ Collectors

Auto-discovered and configured. No manual setup required.

Any Notification Channel

Slack, PagerDuty, Teams, email, webhooks—all built-in.

Built for the People Who Get Paged

Because 3am alerts deserve instant answers, not hour-long hunts.

Every Industry Has Rules. We Master Them.

See how healthcare, finance, and government teams cut monitoring costs 90% while staying audit-ready.

Monitor Any Technology. Configure Nothing.

Install the agent. It already knows your stack.
From Our Users
"A Rare Unicorn"

Netdata gives more than you invest in it. A rare unicorn that obeys the Pareto rule.

— Eduard Porquet Mateu, TMB Barcelona

99% Downtime Reduction

Reduced website downtime by 99% and cloud bill by 30% using Netdata alerts.

— Falkland Islands Government

Real Savings
30% Cloud Cost Reduction

Optimized resource allocation based on Netdata alerts cut cloud spending by 30%.

— Falkland Islands Government

46% Cost Cut

Reduced monitoring staff by 67% while cutting operational costs by 46%.

— Codyas

Real Coverage
"Plugin for Everything"

Netdata has agent capacity or a plugin for everything, including Windows and Kubernetes.

— Eduard Porquet Mateu, TMB Barcelona

"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

Real Speed
Troubleshooting in 30 Seconds

From 2-3 minutes to 30 seconds—instant visibility into any node issue.

— Matthew Artist, Nodecraft

20% Downtime Reduction

20% less downtime and 40% budget optimization from out-of-the-box monitoring.

— Simon Beginn, LANCOM Systems

Pay per Node. Unlimited Everything Else.

One price per node. Unlimited metrics, logs, users, and retention. No per-GB surprises.

Free tier—forever
No metric limits or caps
Retention you control
Cancel anytime
> See pricing plans

What's Your Monitoring Really Costing You?

Most teams overpay by 40-60%. Let's find out why.

Expose hidden metric charges
Calculate tool consolidation
Customers report 30-67% savings
Results in under 60 seconds
> See what you're really paying

Your Infrastructure Is Unique. Let's Talk.

Because monitoring 10 nodes is different from monitoring 10,000.

On-prem & air-gapped deployment
Volume pricing & agreements
Architecture review for your scale
Compliance & security support
> Start a conversation

Monitoring That Sells Itself

Deploy in minutes. Impress clients in hours. Earn recurring revenue for years.

30-second live demos close deals
Zero config = zero support burden
Competitive margins & deal protection
Response in 48 hours
> Apply to partner

Per-Second Metrics at Homelab Prices

Same engine, same dashboards, same ML. Just priced for tinkerers.

Community: Free forever · 5 nodes · non-commercial
Homelab: $90/yr · unlimited nodes · fair usage
> Get the Homelab Plan

$1,000 Per Referral. Unlimited Referrals.

Your colleagues get 10% off. You get 10% commission. Everyone wins.

10% of subscriptions, up to $1,000 each
Track earnings inside Netdata Cloud
PayPal/Venmo payouts in 3-4 weeks
No caps, no complexity
> Get your referral link
Cost Proof
40% Budget Optimization

"Netdata's significant positive impact" — LANCOM Systems

Calculate Your Savings

Compare vs Datadog, Grafana, Dynatrace

Savings Proof
46% Cost Reduction

"Cut costs by 46%, staff by 67%" — Codyas

30% Cloud Bill Savings

"Reduced cloud bill by 30%" — Falkland Islands Gov

Enterprise Proof
"Better Than Combined Alternatives"

"Better observability with Netdata than combining other tools." — TMB Barcelona

Real Engineers, <24h Response

DPA, SLAs, on-prem, volume pricing

Why Partners Win
Demo Live Infrastructure

One command, 30 seconds, real data—no sandbox needed

Zero Tickets, High Margins

Auto-config + per-node pricing = predictable profit

Homelab Ready
Free Video Course

8-episode Netdata tutorial by LearnLinux.tv

76k+ GitHub Stars

3rd most starred monitoring project

Worth Recommending
Product That Delivers

Customers report 40-67% cost cuts, 99% downtime reduction

Zero Risk to Your Rep

Free tier lets them try before they buy

AI Support Assistant, Available 24/7

Nedi has access to all official documentation, source code, and resources. Ask any question about Netdata—responds in your language.

Deployment & configuration
Troubleshooting & sizing
Alerts & notifications
Evidence-based answers
> Ask Nedi now

Never Fight Fires Alone

Docs, community, and expert help—pick your path to resolution.

Learn.netdata.cloud docs
Discord, Forums, GitHub
Premium support available
> Get answers now

60 Seconds to First Dashboard

One command to install. Zero config. 850+ integrations documented.

Linux, Windows, K8s, Docker
Auto-discovers your stack
> Read our documentation

76,000+ Engineers Strong

615+ contributors. 1.5M daily downloads. One mission: simplify observability.

Per-Second. 90% Cheaper. Data Stays Home.

Side-by-side comparisons: costs, real-time granularity, and data sovereignty for every major tool.

See why teams switch from Datadog, Prometheus, Grafana, and more.

> Browse all comparisons
Edge-Native Observability, Born Open Source
Per-second visibility, ML on every metric, and data that never leaves your infrastructure.
Founded in 2016
615+ contributors worldwide
Remote-first, engineering-driven
Open source first
> Read our story
Promises We Publish—and Prove
12 principles backed by open code, independent validation, and measurable outcomes.
Open source, peer-reviewed
Zero config, instant value
Data sovereignty by design
Aligned pricing, no surprises
> See all 12 principles
Edge-Native, AI-Ready, 100% Open
76k+ stars. Full ML, AI, and automation—GPLv3+, not premium add-ons.
76,000+ GitHub stars
GPLv3+ licensed forever
ML on every metric, included
Zero vendor lock-in
> Explore our open source
Build Real-Time Observability for the World
Remote-first team shipping per-second monitoring with ML on every metric.
Remote-first, fully distributed
Open source (76k+ stars)
Challenging technical problems
Your code on millions of systems
> See open roles
Meet the Team Behind Netdata
Conferences, meetups, and tradeshows where you can see Netdata in action and talk to the engineers who build it.
Live demos and deep dives
Book 1-on-1 meetings
Talks and panel sessions
Event recaps and photos
> See all events
Talk to a Netdata Human in <24 Hours
Sales, partnerships, press, or professional services—real engineers, fast answers.
Discuss your observability needs
Pricing and volume discounts
Partnership opportunities
Media and press inquiries
> Book a conversation
Your Data. Your Rules.
On-prem data, cloud control plane, transparent terms.
Trust & Scale
76,000+ GitHub Stars

One of the most popular open-source monitoring projects

SOC 2 Type 2 Certified

Enterprise-grade security and compliance

Data Sovereignty

Your metrics stay on your infrastructure

Validated
University of Amsterdam

"Most energy-efficient monitoring solution" — ICSOC 2023, peer-reviewed

ADASTEC (Autonomous Driving)

"Doesn't miss alerts—mission-critical trust for safety software"

Community Stats
615+ Contributors

Global community improving monitoring for everyone

1.5M+ Downloads/Day

Trusted by teams worldwide

GPLv3+ Licensed

Free forever, fully open source agent

Why Join?
Remote-First

Work from anywhere, async-friendly culture

Impact at Scale

Your work helps millions of systems

$ guides / nats / nats-high-cpu-usage ▌

Operations Guides

NATS high CPU: subject matching, TLS, GC, and the container GOMAXPROCS trap

A NATS server that is pegged on CPU usually looks worse than it is, or better than it is, depending on what you are measuring. The cpu field in /varz is process CPU where 100 means one full core, so on a 16-core host a value of 800 is only 50% busy. Operators regularly page themselves on a number that is not actually saturation, or dismiss real saturation because the number “only” reads 300 on a 2-core container.

The useful frame is this: NATS CPU should scale roughly linearly with message rate. When CPU climbs without a matching rise in in_msgs/out_msgs, the cost is coming from something other than routing: TLS handshakes, Go garbage collection, pathological wildcard matching, Raft consensus churn, or the Go runtime fighting a container CPU limit it does not know about. That last one, the GOMAXPROCS trap, is the most common cause of “NATS is slow but nothing looks loaded” in Kubernetes.

What this means

NATS spends CPU in a small number of places:

  • Subject matching: every inbound message is matched against the subscription trie and fanned out. Cost scales with message rate and subscription complexity.
  • TLS: handshake cost per new connection, plus per-byte encryption. On TLS-enabled servers with high connection churn, handshakes dominate.
  • Go GC: garbage collection consumes CPU proportional to allocation rate and heap churn. GC shows up as CPU spikes followed by drops.
  • JetStream: indexing, compaction, and (in clustered mode) Raft consensus. Raft election storms burn CPU on all nodes simultaneously while blocking writes.
  • Runtime mismatch (GOMAXPROCS): not a cost center itself, but a scheduler sized for the host instead of the container multiplies the cost of everything above.

The diagnostic problem is that all of these present as “CPU high”. The split comes from correlating CPU with message rate, connection churn, and cluster state.

flowchart TD
  A[CPU high on nats-server] --> B{Message rate also up?}
  B -- yes --> C[Normal load: matching + fan-out
check TLS share, plan capacity] B -- no --> D{Connection churn high?} D -- yes --> E[TLS handshake cost
or reconnect storm] D -- no --> F{RSS sawtoothing / GOMEMLIMIT set?} F -- yes --> G[Go GC pressure] F -- no --> H{Clustered JetStream?} H -- yes --> I[Raft elections / meta flapping] H -- no --> J[Wildcard matching pathology
or wrong GOMAXPROCS]

Common causes

CauseWhat it looks likeFirst thing to check
Normal load scalingCPU tracks message rate linearlyin_msgs rate vs cpu over time
TLS handshakesCPU spike with connection churn, calms once connections settletotal_connections delta vs connections
Pathological wildcard matchingCPU high, throughput flat, many */> subscriptions over diverse subjects/varz subscriptions, subject design
Go GC pressureSawtooth RSS, CPU spikes without throughput risemem trend, GOMEMLIMIT/GOGC settings
GOMAXPROCS trap in containersCPU “saturation” far below expected capacity, latency up, everything looks modestly loadednproc in container vs cgroup limit
Raft election stormCPU high on all nodes, leader churn, JetStream API errors/jsz meta_cluster leader stability
CPU steal on oversubscribed VMHigh steal time, Raft instability, latency jittertop/vmstat steal column

Quick checks

All read-only. Run against the monitoring port (default 8222).

# 1. Read CPU correctly: process CPU and core count together
curl -s http://localhost:8222/varz | jq '{cpu, cores}'

# 2. Throughput: is message rate actually up?
curl -s http://localhost:8222/varz | jq '{in_msgs, out_msgs, in_bytes, out_bytes}'
# Take two snapshots 10s apart and compute rates.

# 3. Connection churn: stable count but fast-climbing total means churn
curl -s http://localhost:8222/varz | jq '{connections, total_connections}'

# 4. Slow consumers and their type breakdown
curl -s http://localhost:8222/varz | jq '{slow_consumers, slow_consumer_stats}'

The slow_consumer_stats field has clients/routes/gateways/leafs breakdowns and is available since nats-server v2.10.0.

# 5. Memory: sawtooth indicates GC activity
curl -s http://localhost:8222/varz | jq .mem

# 6. JetStream meta cluster: is the leader flapping?
curl -s http://localhost:8222/jsz | jq '.meta_cluster | {leader, replicas: [.replicas[]? | {name, current, offline, lag}]}'

# 7. JetStream API health: errors and inflight rise during elections and disk stalls
curl -s http://localhost:8222/jsz | jq '{api_total: .api.total, api_errors: .api.errors, api_inflight: .api.inflight}'

# 8. CPU steal on the host (oversubscribed VM check)
vmstat 1 5
# 9. Effective CPU visibility inside the container
nproc                          # what Go sees by default
cat /sys/fs/cgroup/cpu.max     # cgroup v2 limit, or:
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us /sys/fs/cgroup/cpu/cpu.cfs_period_us   # cgroup v1
# 10. Capture a CPU profile for the definitive answer (see diagnose step 5)
nats server request profile cpu --timeout 30s

How to diagnose it

  1. Normalize the number. Compute cpu / (cores * 100) from /varz. On a container limited to 2 cores on a 64-core host, /varz may report cores as the host count, which makes the utilization math lie in the optimistic direction. Cross-check with nproc inside the container and the cgroup quota files above. Sustained utilization above ~70% is capacity-planning territory; above 90% for more than 5 minutes is saturation.

  2. Correlate with message rate. Compute in/out message rates from two /varz snapshots. If CPU and message rate rose together, this is load, and the question is whether the load is expected. If CPU rose and message rate did not, you are in GC, TLS-churn, Raft, matching-pathology, or GOMAXPROCS territory.

  3. Check connection churn and TLS. A stable connections count with a fast-rising total_connections means clients are cycling. Each new TLS connection pays a handshake, and a mass reconnect event (network blip, deploy, LB flap) can saturate all cores on handshakes alone for tens of seconds before settling. The signature is a CPU spike tightly correlated with a connection-count drop-and-recovery. See NATS connection storm and NATS connection churn for the reconnect side.

  4. Rule GC in or out. Watch /varz mem over several minutes. A sawtooth (climb, sharp drop, repeat) is the Go GC at work and is normal at moderate amplitude. If the sawtooth is tight and fast, or if GOMEMLIMIT is set below the live heap, the GC can run nearly continuously and eat a large fraction of CPU. Check the environment for GOMEMLIMIT and GOGC.

  5. Profile, do not guess. Enable profiling via prof_port in the server config and hit the pprof endpoint, or use the NATS CLI: nats server request profile cpu --timeout 30s. The profile tells you directly whether the time is in the sublist/matching code, TLS, GC, or Raft. On a saturated server this is the fastest way to stop arguing about causes. Profiling adds overhead while it runs; 30 seconds is a reasonable window.

  6. Check Raft if JetStream is clustered. A meta leader that keeps changing, replicas reporting current: false or non-zero lag, rising api.errors, and high api.inflight together indicate consensus churn. CPU saturation can itself cause this: a leader too busy to process heartbeats triggers elections, and each election adds CPU, disk, and network cost, which can cascade into a storm. Check host-level steal time too: on oversubscribed VMs, steal is a classic election-storm trigger.

  7. Check the GOMAXPROCS trap explicitly. Compare what Go sees (nproc) with the cgroup limit. If the container limit is 2 cores and the host has 64, the Go runtime sizes its scheduler for 64 and thrashes: goroutines oversubscribe the 2 available cores, GC workers multiply, and tail latency and CPU both climb while throughput stays flat. Details in the fixes below.

Metrics and signals to monitor

SignalWhy it mattersWarning sign
/varz cpu vs coresProcess CPU per core; the only honest read is cpu/(cores*100)Sustained >70% utilization
in_msgs/out_msgs rateBaseline for “is this load or pathology”CPU rising while rate is flat
connections vs total_connectionsDelta exposes churn hidden by a stable countTotal climbing fast, count stable
slow_consumers + type breakdownBackpressure events by type (clients/routes/gateways)Any positive rate; route/gateway events are cluster-severity
/varz memGC behavior and buffer growthTight fast sawtooth, or monotonic growth
/varz subscriptionsMatching cost scales with subscription complexityGrowth uncorrelated with connections
/jsz meta_cluster.leader stabilityElection churn burns CPU cluster-wideLeader changing more than ~once per 5 min
/jsz api.errors, api.inflightWrite-path distress from elections or I/OSustained error rate, high inflight
Host CPU stealNoisy neighbors starve Raft heartbeatsSteal sustained above a few percent

Fixes

Right-size for real load

If CPU tracks message rate and you are simply hot, the fix is capacity: spread connections and subscriptions across more cluster members, reduce fan-out where possible, and keep utilization under ~70% sustained. Do not restart the server as a first move; on JetStream, restarts trigger recovery work and client reconnect storms that temporarily make CPU worse.

Reduce TLS handshake cost

  • Fix the churn source. Handshake storms are a symptom of reconnect storms. Stabilize the network path, LB behavior, or client reconnect jitter first.
  • Keep connections long-lived. Clients should reuse connections, not open per-operation.
  • Confirm TLS is the cost with a profile before changing cipher or cert configuration. If handshakes dominate, staggering client reconnects (jittered backoff in the client) flattens the spike.

Fix pathological subject design

Wildcard subscriptions (*, >) over highly diverse subjects defeat the fast path in the sublist and force repeated matching work. Symptoms: high CPU at modest message rates, with a large subscription count. The fix is subject hygiene: flatten hot subjects, avoid deep wildcard fan-in on high-rate topics, and audit for subscription leaks (subscriptions growing without connection growth). Publishing on many distinct subjects matched by a single broad wildcard is measurably more expensive than a flat subject space.

Tune Go GC

  • If GOMEMLIMIT is set, verify it is comfortably above the live heap. Set too low, the GC runs almost continuously and shows up as a permanent CPU tax. In Kubernetes, a common pattern is GOMEMLIMIT at roughly 80% of the container memory limit; the official NATS Helm chart documentation uses this same rule of thumb.
  • Give the heap headroom: more headroom means fewer GC cycles. If RSS is pinned near the limit, raise the limit or reduce per-connection buffering before touching GC knobs.
  • Confirm GC in the CPU profile before tuning; GC showing high in the profile plus a fast sawtooth in mem is the combination that justifies it.

Fix the container GOMAXPROCS trap

This is the highest-leverage fix for containerized deployments:

  • The Go runtime historically defaulted GOMAXPROCS to the host core count, ignoring cgroup CPU limits. A container limited to 2 cores on a 64-core host runs a 64-way scheduler on 2 cores.
  • Set GOMAXPROCS explicitly to the container’s CPU limit (or use an automaxprocs-style mechanism where it works; note that quota detection cannot infer a limit when the task has no CPU quota and cpu.cfs_quota_us is -1).
  • Go 1.25 made the default cgroup-aware on Linux when a CPU limit is set. If you set only a CPU request and no limit, behavior is unchanged from the old default. The cgroup v1 non-root-mount path bug was fixed in Go 1.26; Go 1.25 releases before that fix may miss CPU limits on affected platforms.
  • Align CPU requests and limits for latency-sensitive NATS. Throttling from a tight CFS quota looks like CPU saturation with extra latency and can trigger Raft elections.

Calm a Raft election storm

  1. Remove the resource pressure first: CPU saturation, disk I/O latency on the JetStream storage path, and CPU steal are the usual roots. Network-attached storage with variable latency is a repeat offender.
  2. Reduce load where possible (pause non-critical publishers) so leaders can process heartbeats.
  3. If the storm is self-sustaining, a rolling restart, one node at a time, can break the cycle. This is disruptive: it forces client reconnects and JetStream recovery on each node. Do it only after the underlying pressure is addressed, or the storm resumes.

Prevention

  • Pin runtime resources in containers: set GOMAXPROCS (or run a Go version with cgroup-aware defaults and set CPU limits), set GOMEMLIMIT sensibly, and size CPU requests and limits together.
  • Baseline CPU per message rate: know your normal slope so “CPU up, rate flat” is immediately visible as an anomaly.
  • Monitor leading indicators, not just saturation: connection churn, slow consumer breakdown by type, meta leader stability, api.inflight, and host steal time all move before CPU pegs.
  • Design subjects deliberately: keep high-rate subjects flat, avoid broad wildcards over diverse namespaces, and alert on subscription-count growth.
  • Put JetStream on local low-latency storage and watch steal on shared VM hosts; Raft heartbeat health depends on both.
  • Keep profiling available (prof_port configured, CLI access working) so a CPU incident is a 5-minute diagnosis, not a guessing game.

How Netdata helps

  • Netdata collects /varz CPU alongside core count, throughput, connections, slow consumers, memory, and subscriptions at per-second resolution, so the “CPU up but message rate flat” divergence is visible on one dashboard instead of two terminals.
  • The slow-consumer breakdown by type (clients, routes, gateways) sits next to connection churn, which separates TLS handshake storms from matching load quickly.
  • Memory sawtooth frequency next to CPU makes GC pressure recognizable without pulling a profile first.
  • JetStream aggregates (API errors, storage, stream/consumer counts) on the same timeline as CPU expose election-driven CPU cost.
  • Host-level metrics (per-core utilization, steal time, cgroup throttling) correlate directly with the NATS process view, which is exactly what the GOMAXPROCS and noisy-neighbor cases need.
  • ML anomaly detection on CPU and throughput flags the slope change when matching cost drifts away from message rate, before users notice latency.