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 / tomcat / tomcat-slowloris-slow-client ▌

Operations Guides

Tomcat Slowloris slow-client attack: connections climbing while bytes stay near zero

Your Tomcat HTTP connector’s connection count keeps climbing. The bytes received rate is nearly flat. CPU is normal, heap looks healthy, GC is quiet, and the thread pool is nowhere near saturated. Yet legitimate users are timing out, and new connections are starting to get refused.

This is the Slowloris slow-client pattern. An attacker opens many TCP connections to Tomcat and dribbles data across them, one byte at a time, or sends a partial HTTP request and never finishes the headers. The connection stays open, consuming a slot in the NIO poller or, on older BIO connectors, a worker thread. The request never completes, so it never reaches your application code. From Tomcat’s perspective, the JVM is idle. From the user’s perspective, the site is down.

The signature is distinctive precisely because so little is happening. Most Tomcat failure modes are loud: GC death spirals spike CPU, thread pool exhaustion fills currentThreadsBusy, classloader leaks fill Metaspace. A slow-client attack is quiet. The damage is in what is not being processed.

What this means

A Slowloris-style attack exploits the gap between “Tomcat accepted a TCP connection” and “Tomcat received a complete HTTP request.” During that gap, the connection occupies a resource: a poller slot on NIO, a worker thread on BIO. The attacker’s goal is to fill that resource with idle connections until legitimate clients cannot get in.

The mechanism differs by connector.

  • NIO (default since Tomcat 8.5): The acceptor hands each new socket to a poller thread, which registers it with a java.nio.Selector. The poller watches thousands of sockets for read readiness. A slow client that never completes its headers holds a socket in the poller, consuming one of the maxConnections slots (default 8192 for NIO), but does not consume a worker thread. The request is only dispatched to the worker pool once the full request is available. This is why currentThreadsBusy can look completely normal while the service is failing.

  • BIO (removed in Tomcat 9+): Each connection was assigned a thread for its entire lifetime, including the time spent reading headers. A Slowloris attack directly filled the worker thread pool, maxing out currentThreadsBusy. This is the mechanism behind CVE-2012-5568, the Tomcat denial-of-service via partial HTTP requests (Slowloris) affecting Apache Tomcat through 7.0.x, when BIO was the default connector.

On modern Tomcat (9, 10.1, 11) with NIO, the attack fills the poller first. Once connectionCount reaches maxConnections, Tomcat stops accepting new connections. They queue in the OS accept backlog, bounded by acceptCount (default 100). When that fills, the kernel responds with RST or drops SYNs. Users see “connection refused” or a timeout. CPU, heap, and the thread pool all look fine the entire time.

The connectionTimeout attribute is your primary defense. It defines how long Tomcat waits, after accepting a connection, for the request URI line to be presented. The code default is 60000ms (60 seconds), though the stock server.xml shipped with Tomcat sets it to 20000ms. If your deployment copies a custom server.xml without setting it explicitly, you get the 60-second code default, which lets a slow client hold a slot for a full minute before reaping.

flowchart TD
    A[Attacker opens many TCP connections] --> B[Each sends 1 byte/sec or partial headers]
    B --> C[NIO poller holds sockets, no worker thread consumed]
    C --> D[connectionCount climbs toward maxConnections]
    D --> E[Legit connections queue in accept backlog]
    E --> F[acceptCount fills, kernel sends RST]
    F --> G[Users see connection refused or timeout]
    D --> H[bytesReceived stays near zero]
    D --> I[CPU and heap remain normal]

Common causes

CauseWhat it looks likeFirst thing to check
Deliberate Slowloris attackMany connections from a handful of source IPs, bytes/connection near zeross -tn state established 'sport = :8080' and count by peer
Misconfigured reverse proxy keepaliveAll connections share one or few proxy IPs, count is stable but highWhether connectionCount matches the proxy upstream pool size
Slow POST body uploadA few clients with extremely low bytes/sec on a legitimate endpointdisableUploadTimeout setting and request sizes in access logs
Half-open or zombie connectionsConnections carrying no bytes at all, often one source networkss -tn peer state, tcpdump for SYN without data

Quick checks

Run these read-only. None require restart or config changes. Adjust the port (8080) and JMX port (9090) to your deployment. You will need jmxterm.jar downloaded separately; it is not bundled with Tomcat.

# Count established connections to the Tomcat HTTP port
ss -tn state established '( sport = :8080 )' | wc -l

# Top source IPs by connection count
ss -tn state established '( sport = :8080 )' | awk 'NR>1{print $5}' | \
  cut -d: -f1 | sort | uniq -c | sort -rn | head -20

# Connection count and limit via JMX
echo 'get -b Catalina:type=ThreadPool,name="http-nio-8080" connectionCount maxConnections' | \
  java -jar jmxterm.jar -l localhost:9090 -n -v silent

# Bytes received and request count (take two readings 30s apart)
echo 'get -b Catalina:type=GlobalRequestProcessor,name="http-nio-8080" bytesReceived requestCount' | \
  java -jar jmxterm.jar -l localhost:9090 -n -v silent

# Thread pool: should be low on NIO, high on BIO
echo 'get -b Catalina:type=ThreadPool,name="http-nio-8080" currentThreadsBusy maxThreads' | \
  java -jar jmxterm.jar -l localhost:9090 -n -v silent

# File descriptor usage vs limit
# NOTE: pgrep returns multiple PIDs if more than one Tomcat is running.
# Pin to a specific PID if needed.
TOMCAT_PID=$(pgrep -f 'catalina.startup.Bootstrap' | head -1)
echo "open: $(ls /proc/$TOMCAT_PID/fd | wc -l)"
cat /proc/$TOMCAT_PID/limits | grep "Max open files"

# Accept queue depth on the listen socket (Recv-Q should be 0 in steady state)
ss -tnl 'sport = :8080'

# Confirm connectionTimeout in server.xml
grep -i 'connectionTimeout\|Connector' ${CATALINA_BASE:-/opt/tomcat}/conf/server.xml

How to diagnose it

  1. Confirm the signature. connectionCount is climbing toward maxConnections, bytesReceived is flat or near zero, currentThreadsBusy is normal (NIO) or maxed (BIO), and CPU and heap are fine. If threads are saturated and CPU is high, you are looking at a different pattern. See the thread pool exhaustion cascade and GC death spiral guides.

  2. Identify the source. Run the top-source-IP check. A slow-client attack typically shows a small number of IPs holding a disproportionate share of the connection count. If all connections come from a single reverse proxy IP, the proxy’s keepalive pool is the suspect, not an attack.

  3. Verify the connector model. Check server.xml for the protocol attribute. NIO is the default on Tomcat 8.5+; NIO2 and APR/native are also available, but BIO was removed in 9+. On NIO, currentThreadsBusy should be low during a Slowloris attack because the requests never complete. If you see high thread usage on NIO, the slow clients may be completing requests very slowly rather than stalling on headers, which is a different problem.

  4. Check file descriptor pressure. Each connection consumes one FD. If connectionCount is high, FD count should track it roughly. If FD count is near ulimit while connectionCount is well below maxConnections, the OS will refuse connections before Tomcat does. Raise the ulimit or the proxy’s connection ceiling.

  5. Inspect the accept queue. ss -tnl 'sport = :8080' shows Recv-Q (current backlog) and Send-Q (the configured acceptCount). A sustained non-zero Recv-Q means connections are waiting because Tomcat is at maxConnections or the acceptor thread is stalled.

  6. Capture the byte rate. Take two readings of bytesReceived 30 seconds apart. If the delta is near zero while connectionCount is in the hundreds or thousands, the diagnosis is confirmed. Compare against requestCount delta: if requests are not completing, the connections are doing no useful work.

  7. Optional packet capture. If you need forensic evidence of the dribble pattern, tcpdump -i any -nn -A 'port 8080 and host <suspect-ip>' shows the slow byte arrival. Keep captures short and avoid running them on a saturated host.

Metrics and signals to monitor

SignalWhy it mattersWarning sign
connectionCount / maxConnectionsSlow clients fill the pollerRatio climbing past 0.8 with no traffic increase
bytesReceived rateSlow clients send almost nothingNear zero while connectionCount climbs
requestCount deltaNo requests completingFlat while connections accumulate
currentThreadsBusyDistinguishes NIO stall from BIO exhaustionNormal on NIO; near maxThreads on BIO
Open file descriptorsEach connection is one FDApproaching ulimit
Accept queue Recv-QConnections backing up at the kernelSustained non-zero
Source IP concentrationSeparates attack from proxy misconfigFew IPs holding many connections
CPU and heapRule out other failure modesBoth normal during a pure slow-client attack

Fixes

Lower connectionTimeout

The most direct Tomcat-side fix is to shorten the window a connection has to start producing a request. Set connectionTimeout explicitly in server.xml:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
           connectionTimeout="5000"
           ... />

5000ms is aggressive but effective against classic Slowloris. 10000ms is a common middle ground. The tradeoff: keepAliveTimeout defaults to the connectionTimeout value, so lowering it also shortens the keep-alive window for legitimate idle clients. If your workload relies on long-lived keep-alive connections from a reverse proxy, set keepAliveTimeout explicitly to a higher value while keeping connectionTimeout low.

The stock server.xml ships connectionTimeout at 20000ms. If your deployment uses a custom server.xml, verify the value is actually set: an unset attribute resolves to the 60000ms code default, which is far too generous for an attack.

For slow POST body uploads specifically, disableUploadTimeout defaults to true, meaning connectionTimeout applies to the upload phase as well. If you set it to false, connectionUploadTimeout (default 300000ms) takes over instead, which is worse for slow-client resistance. Leave disableUploadTimeout at its default.

Terminate slow clients at the reverse proxy

The strongest defense is upstream of Tomcat. A reverse proxy that enforces its own read and header timeouts drops slow clients before they reach the connector.

  • nginx: client_body_timeout and client_header_timeout control how long nginx waits for the client to send data. Defaults are 60s; lower them to 10-15s for internet-facing deployments.
  • HAProxy: timeout http-request and timeout client bound the same window.
  • Apache httpd: mod_reqtimeout (ReqReadTimeout, ReqHeaderTimeout) or mod_antiloris.

With a proxy in front, Tomcat’s connectionCount should reflect the proxy’s upstream keepalive pool, not raw client connections. A Slowloris attack that reaches Tomcat directly means the proxy is either absent or misconfigured.

Block the source IPs

Once you have the source IPs from ss, block them at the firewall or the proxy. This is a temporary measure: distributed attacks rotate sources quickly. Use it to stabilize while you apply the timeout and proxy fixes.

# CAUTION: This modifies the live firewall. Rule is inserted at the top of INPUT.
# Example: drop new connections from a single IP to the Tomcat port
iptables -I INPUT -s <suspect-ip> -p tcp --dport 8080 -j DROP

Increase maxConnections and FD limits (defensive depth only)

Raising maxConnections gives you more headroom before the poller fills, but it does not stop the attack: it just delays saturation. Pair it with a real ulimit and connectionTimeout tuning. Raising maxConnections without raising the FD limit is counterproductive, since each connection needs a descriptor.

Prevention

  • Set connectionTimeout explicitly in server.xml. Do not rely on the 60s code default. 5-10s is a reasonable production value for internet-facing services.
  • Run behind a reverse proxy with its own client timeouts. Tomcat should never be the first thing an untrusted client connects to.
  • Alert on the connectionCount / maxConnections ratio. Threshold at sustained 0.7 or above with no corresponding traffic increase.
  • Alert on bytesReceived against connectionCount. A rising connection count with a flat byte rate is the signature.
  • Monitor source IP concentration. A single IP holding more than a small fraction of maxConnections is worth investigating.
  • Verify disableUploadTimeout stays true. This keeps connectionTimeout in effect during uploads, closing the slow-POST variant.
  • Confirm the connector is NIO or NIO2. On Tomcat 8.5+ NIO is the default, but a copied server.xml can carry an old protocol string. The poller model is dramatically more resistant to slow-client attacks than the removed BIO connector.

How Netdata helps

  • The Tomcat collector polls JMX per second, so connectionCount and maxConnections appear on the same chart. The ratio climbing while bytesReceived stays flat is immediately visible without manual delta math.
  • currentThreadsBusy sits on a separate thread-pool chart. When it stays low while connections spike, that visually distinguishes an NIO slow-client stall from thread pool exhaustion.
  • CPU and heap charts stay in the same dashboard, so you can rule out GC death spiral and application load without switching tools.
  • The process collector exposes open FD count against the process limit, catching the case where FD exhaustion bites before maxConnections.
  • ML anomaly detection flags the unusual connection-to-byte ratio before static thresholds fire.