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 / apache-httpd / apache-httpd-maxrequestworkers-tuning ▌

Operations Guides

Apache MaxRequestWorkers tuning: sizing the worker pool against memory

MaxRequestWorkers is the single most misconfigured directive in Apache HTTPD. The failure pattern is always the same: someone picks a round number like 1000, deploys it on a 4GB server running mod_php children at 50MB RSS each, and the arithmetic (1000 x 50MB = 50GB of potential demand on 4GB of RAM) guarantees an OOM cascade the first time traffic reaches the limit. The setting feels like a performance knob. It is a memory budget.

Derive MaxRequestWorkers from two measured values: how much memory Apache is allowed to use, and how much memory one worker costs under real load. This article covers that derivation, the ServerLimit and ThreadsPerChild ceiling that silently caps whatever you configure, the differences between prefork, worker, and event MPMs that change what a “worker” costs, and how to validate the number after applying it.

If you are here because Apache logged AH00484: server reached MaxRequestWorkers setting, read this before raising the value. Raising it without checking memory turns a queuing problem into an OOM problem. For the incident-response side of that error, see Apache AH00484: server reached MaxRequestWorkers setting - worker pool exhausted.

What MaxRequestWorkers actually limits

MaxRequestWorkers sets the maximum number of simultaneous requests Apache will serve. It was called MaxClients before Apache 2.4; the old name still works, but the new one is more accurate because what it bounds is concurrent request processing, not TCP connections.

What a “worker” is depends on the MPM, and this changes the memory math completely:

  • prefork: one child process per connection, one request at a time per process. Each worker is a full process carrying the entire httpd address space plus loaded modules. With mod_php, 10-50MB+ per process is typical. MaxRequestWorkers = maximum child processes.
  • worker: multiple child processes, each running ThreadsPerChild threads. Each thread handles one connection. MaxRequestWorkers = maximum threads across all children.
  • event (the 2.4 default): same thread model as worker, but keepalive connections are handled asynchronously by listener threads instead of occupying worker threads. MaxRequestWorkers still bounds active request processing, but idle keepalive connections no longer count against it.

Two consequences follow. First, on prefork every additional worker costs a full process worth of RSS. On worker and event, workers are threads sharing a process address space, so the marginal memory cost per worker is far lower and the binding constraint is usually ServerLimit arithmetic, not RAM. Second, on prefork and worker, idle keepalive connections hold workers until KeepAliveTimeout expires; a high keepalive timeout can exhaust the pool at low request rates, which looks like a capacity problem but is a configuration problem.

When all workers are busy, new connections queue in the kernel listen backlog (ListenBacklog, default 511, also capped by net.core.somaxconn). When the backlog fills, clients get connection refused. The degradation is cliff-edge: normal service at 99% utilization, queuing at 100%, refusals shortly after.

The sizing formula

MaxRequestWorkers = memory_budget_for_apache / memory_per_worker

Both inputs need definitions, and both are where teams go wrong.

Memory budget for Apache. Apache’s maximum theoretical memory (all workers active at peak RSS) should not exceed 70% of total RAM. The remaining 30% covers the OS, page cache (which matters for static file performance), and anything else on the box. On a shared host running a database or application server, subtract those first and apply the 70% rule to what is left, or lower the percentage further. On a dedicated web server, 70% of RAM is the ceiling, not the target.

Memory per worker. Measure it, do not assume it. Capture the RSS of real Apache children under real traffic:

# Per-child RSS, sorted worst-first (Debian: apache2; RHEL: httpd)
ps -C httpd -o pid,rss,vsz,cmd --sort=-rss 2>/dev/null || \
  ps -C apache2 -o pid,rss,vsz,cmd --sort=-rss

# Average and count (note the braces: without them the awk only
# runs on the fallback branch)
{ ps -C httpd -o rss --no-headers 2>/dev/null || \
  ps -C apache2 -o rss --no-headers; } | \
  awk '{sum+=$1; count++} END {print "Avg RSS (KB):", sum/count, "Count:", count}'

Use the large end of the distribution, not the average, for worst-case sizing. Any process at more than 2x the average RSS indicates a memory-heavy request path, and that path is what you will hit at peak. For prefork with mod_php and no measurements yet, 50-100MB per child is a reasonable starting estimate, but validate it before trusting the derived number.

RSS overstates true per-process cost because it counts shared library pages in every process. PSS (Proportional Set Size, via smem or /proc/<pid>/smaps_rollup) is more accurate. Sizing from RSS gives a conservative number, which is the safe direction to err.

Worked example: 4GB RAM, dedicated server, mod_php prefork children measured at 50MB RSS at the heavy end. Budget is 4GB x 0.70 = 2.8GB. MaxRequestWorkers = 2800MB / 50MB = 56. Not 1000. If that feels low, the fix is reducing per-worker memory (PHP-FPM instead of mod_php is the usual big win) or adding RAM, not editing the number upward.

flowchart TD
  A[Total RAM] --> B[Subtract OS and other services]
  B --> C[Apply 70% ceiling = Apache budget]
  D[Measure per-worker RSS under load] --> E[Use heavy end, not average]
  C --> F[MaxRequestWorkers = budget / per-worker RSS]
  E --> F
  F --> G{Fits within ServerLimit x ThreadsPerChild?}
  G -- yes --> H[Apply, graceful reload OK]
  G -- no --> I[Raise ServerLimit first, full restart required]

ServerLimit and ThreadsPerChild: the hidden ceiling

MaxRequestWorkers does not act alone. The scoreboard is a fixed-size shared memory segment allocated at startup, sized by ServerLimit (max child processes) multiplied by ThreadsPerChild (threads per process). MaxRequestWorkers cannot exceed that product.

This produces two operational traps:

  1. Silent capping. If you set MaxRequestWorkers above ServerLimit x ThreadsPerChild, Apache reduces it at startup and logs an MPM-specific warning: AH00180 on prefork, AH00318 on worker, and AH00515 on event. If nobody reads startup logs, the server runs with a lower limit than the config says. server-status does not expose MaxRequestWorkers or ServerLimit, so the running value is invisible unless you check the config and the startup log together.
  2. The wrong restart. MaxRequestWorkers can be changed with a graceful restart. ServerLimit and ThreadLimit cannot; raising them requires a full stop and start. Operators raise ServerLimit, run apachectl graceful, and wonder why AH00484 keeps firing. The change never took effect.

For threaded MPMs there is a third constraint: MaxRequestWorkers should be an integer multiple of ThreadsPerChild. If it is not, Apache rounds down at startup and logs a warning. With the default ThreadsPerChild of 25, a MaxRequestWorkers of 56 from the worked example above becomes 50 in practice. Either accept the rounding or set ThreadsPerChild explicitly and make the numbers line up.

Defaults matter because many servers run them. For prefork, the default MaxRequestWorkers is 256. For worker and event, the default is ServerLimit (16) x ThreadsPerChild (25) = 400. On prefork with mod_php, even the default 256 can be far too high for a small box: 256 x 50MB = 12.8GB of theoretical demand. The defaults are not safe; they are just numbers.

MPM-specific considerations

prefork. Memory is the binding constraint, full stop. Each connection costs a process. Derive MaxRequestWorkers from the formula and treat the result as a hard ceiling. KeepAliveTimeout deserves attention too: workers sit in K state holding a full process for an idle connection. A 15-60s keepalive timeout on prefork wastes a large fraction of the pool. Also set MaxConnectionsPerChild to a non-zero value (5000-10000) so leaky children get recycled before their RSS grows into your headroom; the default of 0 (unlimited) is wrong for mod_php or mod_perl deployments.

worker. Threads share the process address space, so per-worker marginal cost is small. The risk shifts: a single stuck backend can hold a thread indefinitely, and a segfault in one thread can kill the whole process and all its threads. Sizing is more about ThreadsPerChild and ServerLimit arithmetic than raw RAM, but total process RSS still counts against the 70% rule.

event. Same as worker for active requests, with the bonus that keepalive connections are offloaded to listener threads and tracked via ConnsAsyncKeepAlive instead of consuming workers. This decouples connection count from worker count, so event tolerates far more concurrent connections than the same MaxRequestWorkers on prefork. If you are on prefork purely out of habit and not because of a non-thread-safe module, moving to event is often a better fix than raising MaxRequestWorkers.

One cross-cutting note: if Apache runs under systemd, unit limits override Apache config. MemoryMax caps total memory regardless of your formula, and TasksMax caps processes plus threads, which can silently keep Apache below its configured MaxRequestWorkers. Check the unit file before blaming the Apache config.

Applying and validating the change

  1. Measure per-worker RSS under realistic load using the ps commands above. Capture the heavy end, not just the average.
  2. Compute the budget: 70% of RAM on a dedicated box, less on a shared one. Divide by per-worker RSS.
  3. Check the ceiling: does the result fit within ServerLimit x ThreadsPerChild? Round to a multiple of ThreadsPerChild on threaded MPMs.
  4. Adjust ServerLimit first if needed, and schedule a full restart for it. A graceful reload will not apply ServerLimit changes.
  5. Validate config with apachectl configtest before any reload. configtest checks syntax only; it does not prove the server is healthy.
  6. Apply: apachectl graceful for MaxRequestWorkers-only changes, full restart when ServerLimit or ThreadLimit changed. During a graceful restart under load, old and new child generations overlap and memory usage can briefly approach double the steady state. Your 70% budget needs to absorb that, or restart during low traffic.
  7. Read the startup log after applying. Look for the MaxRequestWorkers/ServerLimit warning for your MPM (AH00180 prefork, AH00318 worker, AH00515 event) and the ThreadsPerChild rounding warning. What Apache logged is what you actually got.

After the change, verify against live behavior rather than trusting the config file:

# Worker utilization now
curl -s http://localhost/server-status?auto | grep -E "BusyWorkers|IdleWorkers"

# Any MaxRequestWorkers events since the change
grep "AH00484" /var/log/apache2/error.log | tail -20

Signals to watch after tuning

SignalWhy it mattersWarning sign
BusyWorkers / MaxRequestWorkersPrimary saturation ratio; cliff-edge at 100%Sustained above 80% at peak; IdleWorkers at zero
AH00484 in error logApache explicitly reporting pool exhaustionAny occurrence after retuning
Total Apache RSS vs budgetConfirms the memory math holds in productionApproaching 70% of RAM; any sustained swap
Per-child RSS trendDetects leaks that invalidate your per-worker assumptionMonotonic growth over days with MaxConnectionsPerChild 0
Listen backlog (Recv-Q via ss -ltn)Earliest sign workers cannot keep upSustained non-zero during normal traffic
Scoreboard state mixTells you why workers are held (W = backends, K = keepalive, R = slow clients)Dominant non-idle state that is not W under load
Graceful restart overlap memoryOld plus new generations double up brieflyOOM or swap spikes correlated with reloads

The tuning goal is boring: IdleWorkers never pinned at zero, no AH00484 in the log, total RSS comfortably inside the budget at peak, and per-child RSS flat over weeks. For the full signal inventory, see Apache HTTPD monitoring checklist: the signals every production web server needs.

How Netdata helps

Sizing MaxRequestWorkers is a measurement problem, and the measurements are exactly what most teams collect once, by hand, and never again. The useful correlations:

  • Per-process RSS over time, so the per-worker cost in your formula reflects weeks of real traffic, including the heavy endpoints, rather than one afternoon’s ps snapshot.
  • BusyWorkers and IdleWorkers as a time series, so you can see peak utilization against the configured limit and spot the slow upward trend in peak BusyWorkers before it intersects MaxRequestWorkers.
  • Total Apache memory against system RAM and swap, validating that MaxRequestWorkers x worst-case RSS stays under the 70% ceiling and catching graceful-restart memory overlaps.
  • Scoreboard state distribution, which tells you whether workers are held by backends (W), keepalive (K), or slow clients (R), because the right fix for each is different and only one of them is “raise MaxRequestWorkers”.
  • Error log events like AH00484, correlated on the same timeline as utilization and memory, so you can confirm whether the pool limit or the memory budget is the actual binding constraint.

Netdata’s Apache HTTP Server monitoring with Netdata brings these signals together with per-second metrics and ML anomaly detection.

The Netdata solution

Apache HTTP Server monitoring with Netdata

Netdata monitors Apache HTTP Server with per-second metrics from mod_status, pre-built dashboards, and ML-powered anomaly detection. Watch busy versus idle workers and the scoreboard state mix, requests per second, bytes served per second, and request processing duration alongside the rest of your stack, so you catch the worker-exhaustion, slow-backend, and memory incidents in these runbooks before they page anyone.