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-maximum-connections-exceeded ▌

Operations Guides

NATS Maximum Connections Exceeded: new clients rejected at the max_connections wall

New clients cannot connect to your NATS server. Existing connections keep working. Client logs show the protocol error -ERR 'Maximum Connections Exceeded' and then the connection closes. The server itself looks healthy: /healthz returns ok, messages still flow for connected clients, and nothing crashed.

This is the max_connections wall. The server has reached its configured connection limit and is rejecting every new connection during the handshake. There is no queueing and no graceful degradation. One slot short of the limit, everything works. At the limit, every new client is turned away.

The default limit is 65536, but many deployments hit the wall much earlier because an operator set a lower value, an account-level limit subdivides the global cap, or the OS file descriptor ceiling runs out before NATS ever gets there. This guide covers how the limit works, how to tell which ceiling you actually hit, and how to find the clients consuming the slots.

What this means

NATS tracks active client connections per server and compares the count to max_connections on every new connection attempt. When the count reaches the limit, the server accepts the TCP connection, sends -ERR 'Maximum Connections Exceeded' during the handshake, and closes the socket. From the client’s perspective the connection fails immediately; everything already connected is unaffected.

Two limits can reject a connection independently:

  • Server-level max_connections. The global cap for the server. Default 65536.
  • Account-level connection limits. Accounts can carry their own connection limit. A connection is rejected if either the server-level limit or the account-level limit is reached, so one account can hit its wall while the server has thousands of free slots.

There is also a third, silent ceiling: the OS file descriptor limit. Every connection consumes one file descriptor, plus routes, gateways, leaf nodes, JetStream store files, and listener sockets. If ulimit -n for the nats-server process is lower than max_connections, the OS limit bites first and the symptom is similar: new connections fail while existing ones work. This is a cliff-edge failure with no graceful degradation, and default ulimit -n values (often 1024) are catastrophically low for a busy NATS server.

flowchart LR
  C[New client TCP connect] --> D{Under server and account limits?}
  D -- yes --> OK[Handshake completes, client connected]
  D -- no --> ERR["-ERR Maximum Connections Exceeded, socket closed"]
  F[Connection leak or reconnect storm] -. consumes slots .-> D
  G[OS ulimit -n exhausted] -. blocks accept .-> ERR

One subtlety on what counts toward the limit: routes, gateways, and leaf-node connections are not counted in the server’s client pool for max_connections. They are tracked separately and still consume file descriptors, so FD exhaustion arithmetic must include them.

Common causes

CauseWhat it looks likeFirst thing to check
Connection leak in a client applicationconnections climbs monotonically over hours or days; total_connections grows faster than expectedCompare connections vs total_connections on /varz; inspect /connz for old, idle connections
Reconnection stormSharp spike in connections after a network event, deploy, or server restart; CPU spike from TLS handshakestotal_connections delta over the last minutes; correlate with uptime and recent network events
Client pool misconfigurationConnection count is a suspicious round multiple of the number of app instancesCount connections per client IP or name in /connz
Account-level limit reachedOnly one account’s clients are rejected; other accounts connect finePer-account stats via /accstatz against the account’s configured limit
OS file descriptor exhaustionRejections start well below max_connections; accept errors in server logscat /proc/$(pidof nats-server)/limits and count open FDs
Crashed clients holding stale slotsConnections with no traffic that never cleanly closed/varz stale_connections field

Quick checks

All of these are read-only. The monitoring port defaults to 8222.

# Current connections, lifetime total, and configured limit
curl -s http://localhost:8222/varz | jq '{active: .connections, total: .total_connections, max: .max_connections}'

# Utilization as a percentage of the configured limit
curl -s http://localhost:8222/varz | jq '{utilization_pct: ((.connections / .max_connections) * 100)}'

# Stale connections and stalled clients (dead or distressed slots)
curl -s http://localhost:8222/varz | jq '{stale_connections, stalled_clients}'

# Who is holding connections: group by client IP
curl -s "http://localhost:8222/connz?limit=1000" | jq '[.connections[].ip] | group_by(.) | map({ip: .[0], count: length}) | sort_by(-.count) | .[:10]'
# OS file descriptor ceiling for the running server process
cat /proc/$(pidof nats-server)/limits | grep -i "open files"

# Approximate current FD usage of the process
ls /proc/$(pidof nats-server)/fd | wc -l
# Look for accept failures in the server log (adjust path to your logging setup)
grep -i "accept" /var/log/nats/nats-server.log | tail -20
# Or, under systemd:
journalctl -u nats-server --since "30 min ago" | grep -i "accept"

A note on /connz at scale: on servers with many thousands of connections, full /connz scrapes are expensive. Use limit and offset parameters and avoid tight polling loops against it during an incident.

How to diagnose it

  1. Confirm which wall you hit. Pull /varz and compare connections to max_connections. If connections equals max_connections, you hit the NATS limit. If connections is well below max_connections but new clients are still rejected, suspect the OS file descriptor ceiling or an account-level limit.

  2. Rule in or out the FD ceiling. Compare the process Max open files limit against the count of open FDs. The FD budget includes routes, gateways, leaf nodes, JetStream store files, and listener sockets, not just client connections. If the FD count is at or near the limit, this is your wall regardless of what max_connections says. Production NATS servers should run with at least 65536 open files; many teams hit this cliff on their first traffic spike.

  3. Determine whether growth is gradual or sudden. Compute the delta of total_connections over a few minutes. A fast-climbing total_connections with a stable or spiking connections means churn: clients connecting and disconnecting rapidly, which points to a reconnection storm or a crash-looping client that reconnects on every restart. Slow, steady growth in connections with modest churn points to a leak.

  4. Identify who holds the slots. Use /connz grouped by IP, client name, or account to find concentration. A leak usually shows as many long-lived connections from one application or host. A storm shows as many fresh connections with short uptime.

  5. Check for stale slots. Non-zero stale_connections in /varz means clients that failed ping/pong health checks but still occupy slots. Clients that crash without a clean close leave the TCP connection open until the server’s stale detection fires, so a fleet of crashing clients can hold a large number of dead slots during the detection window. For ordinary client connections, the defaults ping every 2 minutes and close after 2 unanswered pings, so detection takes up to about 4 minutes; route connections are capped at a 30-second ping interval.

  6. Check account-level limits if only some clients fail. If clients in one account are rejected while others connect normally, compare that account’s usage from /accstatz against its configured connection limit. Per-account limits are cluster-global, not per-server: servers enforce them against local clients plus reported remote clients.

  7. Correlate with the trigger. A spike that lines up with a deploy, a network partition healing, or a server restart is a reconnection storm. A slow climb with no external event is a leak. Check uptime on /varz and your deploy timeline before blaming the clients.

Metrics and signals to monitor

SignalWhy it mattersWarning sign
connections / max_connections ratioThe only correct way to alert on this wall; absolute counts break across deployment sizes>80% warn, >95% critical
total_connections rate (churn)Reveals reconnect storms and crash-looping clients that a stable connections count hidesRapid growth while connections is flat or spiking
Process FD usage vs ulimit -nThe OS ceiling often bites before max_connections doesFD count >70% of the open-files limit
stale_connectionsDead clients occupying real slotsAny non-zero value sustained >5 minutes
slow_consumers rateSlow consumer disconnects trigger reconnect cycles that churn connection slotsPositive rate alongside rising total_connections
mem (RSS)Each connection costs memory for buffers and goroutines; growth foreshadows the wallMonotonic growth tracking connection growth
Per-account connections (/accstatz)Account limits reject before the server limit doesAccount usage >80% of its configured limit

Alert on the ratio connections / max_connections, never an absolute count. “Alert when connections > 1000” breaks as soon as the limit or the environment changes; “alert when connections exceed 80% of max_connections” survives both. Apply the same ratio thinking to the FD ceiling.

Fixes

Stop the bleeding: free or reclaim slots

If clients are leaking, restarting the offending application releases its slots immediately. This is disruptive to that application but does not touch the NATS server or its healthy clients. Do not restart the NATS server to fix a client-side leak; the slots refill as soon as the leaking clients reconnect.

If the pressure is a reconnection storm, the server usually recovers on its own once clients settle. Check that the storm is decaying (total_connections rate falling) before intervening. If it is cyclical, the underlying cause (flapping load balancer, DNS failure, network device) is still active and that is where to focus.

Raise the limit, carefully

max_connections is a configuration value. Increasing it is legitimate when the current value is simply too small for real load, but it only moves the wall. Before raising it:

  • Verify the FD ceiling first. Raising max_connections above the process ulimit -n is pointless and gives false confidence. Set the open-files limit high enough to cover max_connections plus routes, gateways, leaf nodes, JetStream files, and headroom.
  • Budget the memory. Every connection carries per-connection buffers and goroutines. A large limit on a small host trades connection rejections for memory pressure.

NATS supports runtime configuration reload, and max_connections is reloadable. Raising it does not disconnect existing clients; lowering it below the current count closes randomly selected excess clients. Test the reload path in staging before relying on it during an incident.

Fix the leak

The durable fix for a leak is in the client: ensure connections are closed on shutdown and not recreated per operation. Common patterns are creating a new connection per request instead of reusing one, or losing the reference to a connection without closing it. Use the /connz inventory you gathered during diagnosis to confirm the fix: connection count per host should return to the expected pool size.

Fix the pool misconfiguration

If each application instance opens far more connections than intended, correct the pool size in the client configuration. Connection pooling defaults in some frameworks are generous; a few hundred instances times a large default pool can fill a server that looked comfortably sized.

Prevention

  • Alert on the ratio, early. Warning at >80% and critical at >95% of connections / max_connections gives you hours or days of runway for a leak, and at least a fighting chance during a storm. Keep roughly 20% free slots as standing headroom to absorb reconnection bursts.
  • Monitor the FD ceiling as its own signal. Track process FD usage against ulimit -n and alert well before exhaustion. Set ulimit -n to at least 65536 for production servers, more if the connection budget demands it.
  • Watch churn, not just the count. total_connections delta relative to a stable connections count is the earliest indicator of flapping clients and storm conditions.
  • Size account limits deliberately. If you use accounts, set per-account connection limits so one misbehaving tenant cannot consume the entire server budget.
  • Test reconnection behavior. Client libraries reconnect automatically; verify that your clients use backoff and jitter so a healed partition does not produce a synchronized thundering herd. A storm can consume all free slots in seconds even when steady-state usage is tiny.
  • Audit client shutdown paths. Clients that exit without closing connections leave slots occupied until stale detection cleans them up. Graceful close on shutdown is cheap insurance.

How Netdata helps

Netdata’s NATS collector polls the server’s HTTP monitoring endpoints and turns the raw counters into the signals this incident actually needs:

  • Connection utilization as a ratio. Netdata charts connections alongside max_connections from /varz, so you see saturation approaching as a percentage, not an absolute number you have to mentally compare.
  • Churn visibility. total_connections is collected as a cumulative counter, so the rate view exposes reconnect storms and crash-looping clients even when the live connection count looks stable.
  • Leak detection over time. Per-second and historical retention makes the slow monotonic climb of a connection leak obvious, and lets you correlate the start of the climb with a deploy or config change.
  • Correlation with the downstream signals. Slow consumers, memory, and throughput live on the same dashboard, so you can see whether connection churn is coming from slow-consumer disconnect cycles or from an upstream network event.
  • Cluster-wide view. In a multi-server cluster, per-server connection charts show whether the wall is one overloaded node or a systemic growth trend across all nodes.