<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>HAProxy Operations Guides on Netdata</title><link>https://www.netdata.cloud/guides/haproxy/</link><description>Recent content in HAProxy Operations Guides on Netdata</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://www.netdata.cloud/guides/haproxy/index.xml" rel="self" type="application/rss+xml"/><item><title>HAProxy 400 and 408 spikes: bad requests, request timeouts, and Slowloris</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-400-408-request-errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-400-408-request-errors/</guid><description>&lt;h1 id="haproxy-400-and-408-spikes-bad-requests-request-timeouts-and-slowloris">HAProxy 400 and 408 spikes: bad requests, request timeouts, and Slowloris&lt;/h1>
&lt;p>Your frontend &lt;code>hrsp_4xx&lt;/code> counter just doubled, and it is not 404s. The spike is 400s and 408s, which means HAProxy itself is rejecting or timing out requests before they reach a backend. Unlike backend-generated 4xx, these errors say something about the bytes arriving at your frontend: malformed requests, protocol mismatches, oversized headers, or clients that open connections and never finish the request.&lt;/p></description></item><item><title>HAProxy 502 Bad Gateway: backend connection and response failures</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-502-bad-gateway/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-502-bad-gateway/</guid><description>&lt;h1 id="haproxy-502-bad-gateway-backend-connection-and-response-failures">HAProxy 502 Bad Gateway: backend connection and response failures&lt;/h1>
&lt;p>Clients are getting 502 Bad Gateway from HAProxy. The backend may look healthy, health checks may be green, and yet some fraction of requests comes back with a 502 the application never logged. That is the signature: a 502 from HAProxy is usually generated by HAProxy itself, not passed through from the backend.&lt;/p>
&lt;p>HAProxy emits a 502 in two situations. First, it could not establish or use a connection to the backend server at all. Second, it connected fine, but the server sent an invalid, truncated, or incomplete response, or closed the connection mid-response. These are different failure modes with different fixes, and the fastest path to resolution is separating them before touching anything.&lt;/p></description></item><item><title>HAProxy 503 Service Unavailable: no server is available to handle this request</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-503-service-unavailable/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-503-service-unavailable/</guid><description>&lt;h1 id="haproxy-503-service-unavailable-no-server-is-available-to-handle-this-request">HAProxy 503 Service Unavailable: no server is available to handle this request&lt;/h1>
&lt;p>Clients are getting &lt;code>503 Service Unavailable&lt;/code> with the message &lt;code>no server is available to handle this request&lt;/code>. HAProxy generated this error. Unlike a 500 from your application or a 502 from a broken backend response, a 503 with this message never touched a backend server. HAProxy looked at its own state, concluded it had nowhere to send the request, and answered on its own.&lt;/p></description></item><item><title>HAProxy 504 Gateway Timeout: timeout server and the backend timeout cascade</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-504-gateway-timeout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-504-gateway-timeout/</guid><description>&lt;h1 id="haproxy-504-gateway-timeout-timeout-server-and-the-backend-timeout-cascade">HAProxy 504 Gateway Timeout: timeout server and the backend timeout cascade&lt;/h1>
&lt;p>Your frontend error rate jumps. Clients report &amp;ldquo;504 Gateway Timeout.&amp;rdquo; HAProxy looks alive: the process is running, servers are UP, health checks are green. Yet requests are dying on a timer.&lt;/p>
&lt;p>This is the backend timeout cascade, and the 504 is its final symptom. The servers are reachable (TCP accepts succeed), but the application behind them has slowed past the &lt;code>timeout server&lt;/code> budget. HAProxy holds the client connection, waits, gives up, and generates a 504 itself.&lt;/p></description></item><item><title>HAProxy 5xx delta: telling HAProxy-generated errors from backend errors</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-frontend-backend-5xx-delta/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-frontend-backend-5xx-delta/</guid><description>&lt;h1 id="haproxy-5xx-delta-telling-haproxy-generated-errors-from-backend-errors">HAProxy 5xx delta: telling HAProxy-generated errors from backend errors&lt;/h1>
&lt;p>Your frontend &lt;code>hrsp_5xx&lt;/code> counter is climbing and users are seeing errors. The first question that decides the next hour of your incident response: is HAProxy generating these errors, or is it passing through errors your backend servers produced?&lt;/p>
&lt;p>HAProxy counts 5xx responses in both places. Frontend rows count every 5xx the client saw, including responses HAProxy fabricated itself. Backend and server rows count only 5xx responses that actually came back from a server. The difference between the two answers &amp;ldquo;is the backend failing or is HAProxy failing?&amp;rdquo; without walking every backend one by one.&lt;/p></description></item><item><title>HAProxy backend losing servers: active server count and cascade risk</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-backend-losing-servers-capacity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-backend-losing-servers-capacity/</guid><description>&lt;h1 id="haproxy-backend-losing-servers-active-server-count-and-cascade-risk">HAProxy backend losing servers: active server count and cascade risk&lt;/h1>
&lt;p>A backend can lose half its servers and HAProxy will still report the BACKEND aggregate row as UP. As long as one server is available, the rollup status says traffic is being served, and status-based dashboards stay green. Meanwhile the surviving servers are absorbing redistributed load, their session counts are climbing, and you are one health check failure away from a full 503 outage for that backend.&lt;/p></description></item><item><title>HAProxy backend queue building (qcur): requests waiting for a free server slot</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-backend-queue-building-qcur/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-backend-queue-building-qcur/</guid><description>&lt;h1 id="haproxy-backend-queue-building-qcur-requests-waiting-for-a-free-server-slot">HAProxy backend queue building (qcur): requests waiting for a free server slot&lt;/h1>
&lt;p>You are looking at HAProxy stats and &lt;code>qcur&lt;/code> is nonzero on a backend, or worse, climbing. Clients have not seen errors yet, but latency is drifting up. That instinct that something is wrong is correct: &lt;code>qcur&lt;/code> is the earliest signal that backend capacity is exhausted, and it shows up before any error counter moves.&lt;/p>
&lt;p>&lt;code>qcur&lt;/code> is the instantaneous count of connections sitting in a queue because every server that could take them is already at its &lt;code>maxconn&lt;/code> limit. Those requests are not being served. They are parked, consuming their client&amp;rsquo;s timeout budget, waiting for a slot to free up. If the queue grows faster than slots free up, the outcome is queue timeouts and 503s.&lt;/p></description></item><item><title>HAProxy bandwidth (bin/bout): bytes in, bytes out, and capacity planning</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-bandwidth-bytes-in-out/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-bandwidth-bytes-in-out/</guid><description>&lt;h1 id="haproxy-bandwidth-binbout-bytes-in-bytes-out-and-capacity-planning">HAProxy bandwidth (bin/bout): bytes in, bytes out, and capacity planning&lt;/h1>
&lt;p>Every row in HAProxy&amp;rsquo;s stats output carries two cumulative byte counters: &lt;code>bin&lt;/code> (bytes in) and &lt;code>bout&lt;/code> (bytes out). They are the ground truth for how much data actually moves through the proxy, per frontend, per backend, and per server. Most teams only look at them when a network link saturates. Used properly, they are a baseline signal, an anomaly detector, and the raw material for bandwidth capacity planning.&lt;/p></description></item><item><title>HAProxy compression overhead: comp_byp, CPU cost, and when compression backfires</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-compression-cpu-overhead/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-compression-cpu-overhead/</guid><description>&lt;h1 id="haproxy-compression-overhead-comp_byp-cpu-cost-and-when-compression-backfires">HAProxy compression overhead: comp_byp, CPU cost, and when compression backfires&lt;/h1>
&lt;p>HTTP compression in HAProxy is a trade: CPU cycles on the proxy in exchange for fewer bytes on the wire. When it works, text responses shrink by 50 to 80 percent and clients on slow links see faster page loads. When it backfires, the proxy burns event-loop CPU compressing content that does not compress, or it sheds compression work under load and you lose the bandwidth savings exactly when traffic is highest.&lt;/p></description></item><item><title>HAProxy connect time (ctime) high: network latency and backend accept-queue overflow</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-connect-time-ctime-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-connect-time-ctime-high/</guid><description>&lt;h1 id="haproxy-connect-time-ctime-high-network-latency-and-backend-accept-queue-overflow">HAProxy connect time (ctime) high: network latency and backend accept-queue overflow&lt;/h1>
&lt;p>Your HAProxy backend shows &lt;code>ctime&lt;/code> climbing from a steady 1-2ms to tens or hundreds of milliseconds. Total request latency (&lt;code>ttime&lt;/code>) rises with it, and if the trend continues, connect timeouts (&lt;code>econ&lt;/code> increments, 502/504s on the frontend) are next. The connect phase of the HAProxy-to-backend path is degrading, and it almost always means one of three things: the network path is congested or losing packets, the backend&amp;rsquo;s kernel accept queue is overflowing, or the backend is too CPU-starved to answer the handshake promptly.&lt;/p></description></item><item><title>HAProxy connection errors (econ): backend connections refused, timed out, or reset</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-connection-errors-econ/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-connection-errors-econ/</guid><description>&lt;h1 id="haproxy-connection-errors-econ-backend-connections-refused-timed-out-or-reset">HAProxy connection errors (econ): backend connections refused, timed out, or reset&lt;/h1>
&lt;p>Your HAProxy backend shows a rising &lt;code>econ&lt;/code> counter. Clients may not see errors yet, because HAProxy retries failed connections and redispatches to other servers, but the counter means HAProxy is trying to open TCP connections to a backend server and failing. The connection is being refused, timing out, or getting reset.&lt;/p>
&lt;p>&lt;code>econ&lt;/code> is one of the highest-signal error counters HAProxy exposes, and one of the most misread. It is cumulative, it only increments on new connection attempts (so connection reuse can mask a real problem for hours), and it lumps three very different failure modes into one number. Telling &amp;ldquo;the server process is dead&amp;rdquo; apart from &amp;ldquo;a firewall is silently dropping SYNs&amp;rdquo; requires correlating &lt;code>econ&lt;/code> with &lt;code>ctime&lt;/code> and a few other signals.&lt;/p></description></item><item><title>HAProxy connection reuse dropping: http-reuse, pooling, and handshake overhead</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-connection-reuse-dropping/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-connection-reuse-dropping/</guid><description>&lt;h1 id="haproxy-connection-reuse-dropping-http-reuse-pooling-and-handshake-overhead">HAProxy connection reuse dropping: http-reuse, pooling, and handshake overhead&lt;/h1>
&lt;p>Backend latency crept up, CPU on the HAProxy host is climbing, and &lt;code>ctime&lt;/code> went from zero to measurable milliseconds, but the backends are healthy and the network looks fine. Before you blame the application or the network, check the one ratio almost nobody graphs: connection reuse, &lt;code>reuse / (connect + reuse)&lt;/code> on the backend. If it fell off a cliff, HAProxy stopped reusing pooled backend connections and is now paying a full TCP (and possibly TLS) handshake for every request.&lt;/p></description></item><item><title>HAProxy counter resets on reload: phantom drops and spikes in your metrics</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-counter-resets-on-reload/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-counter-resets-on-reload/</guid><description>&lt;h1 id="haproxy-counter-resets-on-reload-phantom-drops-and-spikes-in-your-metrics">HAProxy counter resets on reload: phantom drops and spikes in your metrics&lt;/h1>
&lt;p>Your HAProxy 5xx dashboard just showed a cliff-edge drop to zero, then a vertical spike an hour later. No user complaints. No backend incidents. No deploys. If this pattern repeats on a schedule, or right after config changes, you are almost certainly looking at counter resets from HAProxy reloads, not real traffic events.&lt;/p>
&lt;p>Every time HAProxy reloads its configuration, a new worker process starts. That new process has its own in-memory statistics, and every cumulative counter starts at zero: &lt;code>hrsp_5xx&lt;/code>, &lt;code>econ&lt;/code>, &lt;code>eresp&lt;/code>, &lt;code>bin&lt;/code>, &lt;code>bout&lt;/code>, &lt;code>wretr&lt;/code>, &lt;code>wredis&lt;/code>, &lt;code>chkfail&lt;/code>, the SSL counters, all of them. A reload is a new process for stats purposes, not a continuation of the old one.&lt;/p></description></item><item><title>HAProxy DNS resolver failure: stale IPs and silently misrouted traffic</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-dns-resolver-failure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-dns-resolver-failure/</guid><description>&lt;h1 id="haproxy-dns-resolver-failure-stale-ips-and-silently-misrouted-traffic">HAProxy DNS resolver failure: stale IPs and silently misrouted traffic&lt;/h1>
&lt;p>Your backend servers report UP. Health checks pass. The stats page is green. And traffic is going to IP addresses that belong to pods deleted an hour ago, or to a node that now runs something else entirely.&lt;/p>
&lt;p>This is the HAProxy DNS resolver failure mode, and it only bites deployments that resolve backends dynamically: &lt;code>server-template&lt;/code> with Consul DNS, Kubernetes headless services, SRV records, or any setup where server addresses come from DNS instead of static config lines. When the resolver times out or a TTL expires without a successful re-resolution, HAProxy keeps routing to the last IPs it knew about. There is no stats CSV counter for this. &lt;code>show resolvers&lt;/code> is the only direct view into it, and most teams never look.&lt;/p></description></item><item><title>HAProxy DroppedLogs: losing log lines exactly when you need them</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-dropped-logs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-dropped-logs/</guid><description>&lt;h1 id="haproxy-droppedlogs-losing-log-lines-exactly-when-you-need-them">HAProxy DroppedLogs: losing log lines exactly when you need them&lt;/h1>
&lt;p>You are mid-incident. Traffic is spiking, 5xx rates are climbing, and you go to the HAProxy logs for per-request timing and termination codes. The logs are not there. Whole seconds of traffic are missing, right at the peak. Then you notice &lt;code>DroppedLogs&lt;/code> in &lt;code>show info&lt;/code> has been incrementing for hours and nobody was watching it.&lt;/p>
&lt;p>&lt;code>DroppedLogs&lt;/code> counts log messages HAProxy tried to emit but could not deliver. The cause is almost never HAProxy itself: it is the log pipeline downstream. A syslog daemon that cannot keep up, a socket buffer that overflowed, a log target that stalled. There is no error in the HAProxy log, because the line that would have told you is one of the ones that got dropped.&lt;/p></description></item><item><title>HAProxy ephemeral port exhaustion: TIME_WAIT and backend connection churn</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-ephemeral-port-exhaustion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-ephemeral-port-exhaustion/</guid><description>&lt;h1 id="haproxy-ephemeral-port-exhaustion-time_wait-and-backend-connection-churn">HAProxy ephemeral port exhaustion: TIME_WAIT and backend connection churn&lt;/h1>
&lt;p>Your backends are healthy. Every server is UP, health checks pass, the application team sees nothing wrong on their side. Yet HAProxy is logging failed backend connections, &lt;code>econ&lt;/code> counters are climbing, and clients see intermittent 502s or stalls. On the HAProxy host, tens of thousands of sockets sit in TIME_WAIT.&lt;/p>
&lt;p>This is ephemeral port exhaustion on the backend-facing side of HAProxy. Every new TCP connection from HAProxy to a backend consumes one local ephemeral port. When the connection closes, that port is held in TIME_WAIT for 60 seconds before it can be reused. If the rate of new backend connections is high enough, the port range empties and &lt;code>connect()&lt;/code> starts failing with &lt;code>EADDRNOTAVAIL&lt;/code>. HAProxy reports these as connection errors even though nothing is wrong with the backend.&lt;/p></description></item><item><title>HAProxy health check L4TOUT and L4CON: server marked DOWN and unreachable</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-health-check-l4tout-l4con/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-health-check-l4tout-l4con/</guid><description>&lt;h1 id="haproxy-health-check-l4tout-and-l4con-server-marked-down-and-unreachable">HAProxy health check L4TOUT and L4CON: server marked DOWN and unreachable&lt;/h1>
&lt;p>You look at the HAProxy stats page (or your monitoring) and a server row is red. The &lt;code>last_chk&lt;/code> field says &lt;code>L4TOUT&lt;/code> or &lt;code>L4CON&lt;/code>, &lt;code>status&lt;/code> says &lt;code>DOWN&lt;/code>, and HAProxy has stopped routing traffic to that server. Both codes mean the failure happened before any HTTP, before any application code, at the plain TCP layer.&lt;/p>
&lt;p>&lt;code>L4TOUT&lt;/code> means HAProxy opened a socket and the TCP connect did not complete within the check timeout. &lt;code>L4CON&lt;/code> means the connect attempt failed immediately with an error, typically &amp;ldquo;Connection refused&amp;rdquo; (TCP RST) or &amp;ldquo;No route to host&amp;rdquo; (ICMP). The server is unreachable at the TCP layer, and after &lt;code>fall&lt;/code> consecutive failures (default 3), HAProxy marks it DOWN and redistributes its traffic.&lt;/p></description></item><item><title>HAProxy health check L7STS: server DOWN on the wrong HTTP status</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-health-check-l7sts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-health-check-l7sts/</guid><description>&lt;h1 id="haproxy-health-check-l7sts-server-down-on-the-wrong-http-status">HAProxy health check L7STS: server DOWN on the wrong HTTP status&lt;/h1>
&lt;p>A backend server flips to DOWN in the stats page, &lt;code>last_chk&lt;/code> shows &lt;code>L7STS&lt;/code>, and the log line says something like &lt;code>Layer7 wrong status, code: 503, info: &amp;quot;Service Unavailable&amp;quot;&lt;/code>. The server process is running. The port is open. You can curl it by hand and get a response. But HAProxy has pulled it out of rotation and traffic is concentrating on the survivors.&lt;/p></description></item><item><title>HAProxy health checks green but the application is broken: when UP does not mean healthy</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-health-check-green-app-broken/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-health-check-green-app-broken/</guid><description>&lt;h1 id="haproxy-health-checks-green-but-the-application-is-broken-when-up-does-not-mean-healthy">HAProxy health checks green but the application is broken: when UP does not mean healthy&lt;/h1>
&lt;p>Every server in the backend shows UP. Health checks are passing. And users are getting 500s. This is one of the most common HAProxy postmortem findings: &amp;ldquo;health checks said everything was fine.&amp;rdquo;&lt;/p>
&lt;p>The failure is conceptual, not a bug. HAProxy&amp;rsquo;s health check engine runs independently of traffic and only proves that the specific probe you configured succeeds. A TCP check proves the port accepts connections. An HTTP check to &lt;code>/health&lt;/code> proves that one URL returns the expected status. Neither proves that real requests, which exercise the database, auth, and downstream dependencies, actually work.&lt;/p></description></item><item><title>HAProxy hot-thread skew: when average Idle_pct hides a saturated thread</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-thread-skew-show-activity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-thread-skew-show-activity/</guid><description>&lt;h1 id="haproxy-hot-thread-skew-when-average-idle_pct-hides-a-saturated-thread">HAProxy hot-thread skew: when average Idle_pct hides a saturated thread&lt;/h1>
&lt;p>Latency is climbing, throughput has plateaued below what the hardware should deliver, and &lt;code>show info&lt;/code> reports &lt;code>Idle_pct&lt;/code> at a comfortable 60 or 70 percent. System CPU shows one core pegged while the others coast. The bottleneck is not HAProxy as a whole. It is one thread.&lt;/p>
&lt;p>With &lt;code>nbthread &amp;gt; 1&lt;/code> (the default since HAProxy 2.0, where &lt;code>nbthread&lt;/code> is set to the number of available CPUs), work is spread across per-thread event loops. &lt;code>Idle_pct&lt;/code> is a process-level average across all of them. One thread pinned at 100% while the rest sit at 80% idle averages out to &amp;ldquo;looks fine,&amp;rdquo; but that hot thread caps overall throughput: every connection it owns gets processed late, and no other thread can take them over.&lt;/p></description></item><item><title>HAProxy Idle_pct dropping: event-loop CPU saturation and the busy-polling trap</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-idle-pct-low/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-idle-pct-low/</guid><description>&lt;h1 id="haproxy-idle_pct-dropping-event-loop-cpu-saturation-and-the-busy-polling-trap">HAProxy Idle_pct dropping: event-loop CPU saturation and the busy-polling trap&lt;/h1>
&lt;p>Your HAProxy latency is climbing, nothing is queuing on the backends, and the one metric that looks wrong is &lt;code>Idle_pct&lt;/code> sliding toward zero. Or worse: &lt;code>Idle_pct&lt;/code> has been pinned at zero for weeks and you only just noticed because someone finally asked what it meant. Both situations are common, and they have very different explanations.&lt;/p>
&lt;p>&lt;code>Idle_pct&lt;/code> is HAProxy&amp;rsquo;s self-reported measure of event-loop headroom: the share of time the loop spends waiting in &lt;code>poll()&lt;/code> versus processing events. It measures HAProxy CPU headroom, not system CPU. A host at 50% system CPU with &lt;code>Idle_pct&lt;/code> at 80% is fine. A host at 50% system CPU with &lt;code>Idle_pct&lt;/code> at 10% means HAProxy itself is saturated. That distinction is the entire point of the metric, and it is also where the traps live.&lt;/p></description></item><item><title>HAProxy in TCP mode: the HTTP signals you lose and what to watch instead</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-tcp-mode-monitoring-blind-spots/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-tcp-mode-monitoring-blind-spots/</guid><description>&lt;h1 id="haproxy-in-tcp-mode-the-http-signals-you-lose-and-what-to-watch-instead">HAProxy in TCP mode: the HTTP signals you lose and what to watch instead&lt;/h1>
&lt;p>When a frontend and its backend run with &lt;code>mode tcp&lt;/code>, HAProxy stops parsing the protocol inside the connection. It forwards bytes and nothing more. That is often correct: databases, gRPC, Redis, TLS passthrough, or protocols HAProxy does not understand. But it amputates a large part of the monitoring surface most HAProxy alerting assumes exists.&lt;/p>
&lt;p>The failure mode this creates is not an outage; it is a blind spot. Dashboards that worked in HTTP mode start reporting zeros that look like &amp;ldquo;no traffic&amp;rdquo; or &amp;ldquo;no errors.&amp;rdquo; Health checks stay green while the application behind them is broken. Latency alerts keyed on &lt;code>rtime&lt;/code> never fire again because &lt;code>rtime&lt;/code> is permanently zero. The proxy is fine; your visibility into what flows through it is not.&lt;/p></description></item><item><title>HAProxy kernel accept-queue overflow: silent SYN drops and somaxconn</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-listen-queue-overflow-somaxconn/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-listen-queue-overflow-somaxconn/</guid><description>&lt;h1 id="haproxy-kernel-accept-queue-overflow-silent-syn-drops-and-somaxconn">HAProxy kernel accept-queue overflow: silent SYN drops and somaxconn&lt;/h1>
&lt;p>Clients report connection timeouts. You open the HAProxy stats page and everything looks fine: session rate is normal, no 5xx spike, servers are UP, Idle_pct is healthy. The network team sees nothing. The clients insist the load balancer is dropping them.&lt;/p>
&lt;p>Both sides are right. The kernel is silently dropping SYN packets in the accept queue before they ever reach HAProxy&amp;rsquo;s event loop. From HAProxy&amp;rsquo;s perspective, those connections never existed. There is no log line, no error counter, no stat field that increments. The only evidence lives in two kernel counters, &lt;code>ListenOverflows&lt;/code> and &lt;code>ListenDrops&lt;/code>, that almost nobody graphs.&lt;/p></description></item><item><title>HAProxy maxconn hierarchy: global, frontend, backend, and per-server limits</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-maxconn-hierarchy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-maxconn-hierarchy/</guid><description>&lt;h1 id="haproxy-maxconn-hierarchy-global-frontend-backend-and-per-server-limits">HAProxy maxconn hierarchy: global, frontend, backend, and per-server limits&lt;/h1>
&lt;p>HAProxy does not have one connection limit. It has four, enforced independently at the global, frontend, backend, and per-server levels. Any one of them can throttle traffic while the other three show headroom. This is why &amp;ldquo;global maxconn is at 30%&amp;rdquo; tells you almost nothing during an incident: the request path can be blocked at a per-server limit you never set, or queuing behind a backend constraint you did not know existed.&lt;/p></description></item><item><title>HAProxy maxconn reached: new connections queued and rejected</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-maxconn-reached/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-maxconn-reached/</guid><description>&lt;h1 id="haproxy-maxconn-reached-new-connections-queued-and-rejected">HAProxy maxconn reached: new connections queued and rejected&lt;/h1>
&lt;p>HAProxy is refusing work. Clients see connection timeouts or resets, load tests fail at a suspiciously round concurrency number, and yet the HAProxy process looks healthy: CPU is fine, memory is fine, the process is up, health checks pass. The stats tell the real story: &lt;code>CurrConns&lt;/code> is flat at &lt;code>Maxconn&lt;/code>, or &lt;code>scur&lt;/code> is pinned at &lt;code>slim&lt;/code> on a frontend, and it does not move.&lt;/p></description></item><item><title>HAProxy memory growth and OOM: connection buffers, pools, and memory ceilings</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-memory-growth-oom/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-memory-growth-oom/</guid><description>&lt;h1 id="haproxy-memory-growth-and-oom-connection-buffers-pools-and-memory-ceilings">HAProxy memory growth and OOM: connection buffers, pools, and memory ceilings&lt;/h1>
&lt;p>The symptom usually arrives as a dead process, not a slow one. HAProxy was proxying fine, then the PID changed, connections dropped for a few seconds, and &lt;code>dmesg&lt;/code> shows the OOM killer picked haproxy as the victim. Or, before it gets that far, RSS climbs day over day and nobody knows whether it is a leak or just load.&lt;/p></description></item><item><title>HAProxy monitoring checklist: the signals every production proxy needs</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-monitoring-checklist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-monitoring-checklist/</guid><description>&lt;h1 id="haproxy-monitoring-checklist-the-signals-every-production-proxy-needs">HAProxy monitoring checklist: the signals every production proxy needs&lt;/h1>
&lt;p>Most HAProxy outages are visible in its own stats long before users notice. The problem is that the stats socket exposes dozens of fields, and teams usually wire up the five metrics their dashboard template shipped with and stop there. Then a reload storm, a retry storm, or a silent stick-table overflow teaches them what they were missing.&lt;/p>
&lt;p>This checklist organizes the signals that catch production failures into four maturity levels: survival, operational, mature, and expert. Each level builds on the previous one. You do not need to reach expert on day one, but you should know which level you are at, because that determines which failure modes are invisible to you.&lt;/p></description></item><item><title>HAProxy monitoring maturity model: from survival to expert</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-monitoring-maturity-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-monitoring-maturity-model/</guid><description>&lt;h1 id="haproxy-monitoring-maturity-model-from-survival-to-expert">HAProxy monitoring maturity model: from survival to expert&lt;/h1>
&lt;p>Most HAProxy monitoring setups fall into one of two states: a process check and a prayer, or a wall of charts nobody reads. Neither answers the question that matters during an incident: is HAProxy the problem, the messenger, or the victim.&lt;/p>
&lt;p>This article defines four maturity levels for HAProxy monitoring: Survival, Operational, Mature, and Expert. Each level adds signals that catch a class of failures the previous level cannot see. The goal is not to collect everything. The goal is to know, at any moment, which questions your monitoring can answer and which it cannot.&lt;/p></description></item><item><title>HAProxy peers sync broken: divergent stick tables across instances</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-peers-sync-broken/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-peers-sync-broken/</guid><description>&lt;h1 id="haproxy-peers-sync-broken-divergent-stick-tables-across-instances">HAProxy peers sync broken: divergent stick tables across instances&lt;/h1>
&lt;p>You have two or more HAProxy instances fronting the same service, and their behavior no longer matches. Rate limiting triggers on one node but lets the same client through on another. A failover happens and every sticky session evaporates, even though you configured stick tables and a peers section specifically to survive that event. Or you compare &lt;code>show table&lt;/code> output across instances and the entry counts are wildly different when they should be near-identical.&lt;/p></description></item><item><title>HAProxy per-source-IP rate limiting: stick tables, conn_rate, and http_req_rate</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-rate-limiting-per-source-ip/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-rate-limiting-per-source-ip/</guid><description>&lt;h1 id="haproxy-per-source-ip-rate-limiting-stick-tables-conn_rate-and-http_req_rate">HAProxy per-source-IP rate limiting: stick tables, conn_rate, and http_req_rate&lt;/h1>
&lt;p>Per-source-IP rate limiting in HAProxy is built on stick tables: in-memory key-value stores that track counters per client key (usually the source IP) and expose those counters to ACLs. When it breaks, it breaks silently. A full table, a mismatched expire, or an IPv6 client population can disable your limiting without a single error in the logs, and most teams find out only after an abuse incident.&lt;/p></description></item><item><title>HAProxy PoolFailed: buffer starvation and memory-allocator failures</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-poolfailed-buffer-starvation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-poolfailed-buffer-starvation/</guid><description>&lt;h1 id="haproxy-poolfailed-buffer-starvation-and-memory-allocator-failures">HAProxy PoolFailed: buffer starvation and memory-allocator failures&lt;/h1>
&lt;p>&lt;code>PoolFailed&lt;/code> in &lt;code>show info&lt;/code> counts failed internal memory-pool allocations since process start. It is normally zero. Any nonzero value means HAProxy tried to allocate a buffer, connection, or session object and could not get one. Work was dropped or stalled because of it.&lt;/p>
&lt;p>The tricky part is how this surfaces. Buffer starvation rarely looks like a memory problem from the outside. It looks like mysterious latency: &lt;code>rtime&lt;/code> and backend health are fine, CPU has headroom, the network is clean, and yet clients see stalls and sporadic failures. &lt;code>PoolFailed&lt;/code> is one of the few direct signals that HAProxy itself is refusing work because it ran out of an internal resource.&lt;/p></description></item><item><title>HAProxy queue time (qtime) rising: the earliest backend-saturation signal</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-queue-time-qtime-rising/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-queue-time-qtime-rising/</guid><description>&lt;h1 id="haproxy-queue-time-qtime-rising-the-earliest-backend-saturation-signal">HAProxy queue time (qtime) rising: the earliest backend-saturation signal&lt;/h1>
&lt;p>You are looking at a backend whose &lt;code>qtime&lt;/code> has crept from zero to a few hundred milliseconds, or a few seconds, and nothing is &amp;ldquo;down&amp;rdquo; yet. Health checks are green, error rates are flat, and no alert has fired. That is the point of qtime: it moves before the failure signals.&lt;/p>
&lt;p>Nonzero qtime means requests spent time in HAProxy&amp;rsquo;s queue because every usable server connection slot was busy when they arrived. It is usually the first measurable symptom of backend saturation: ahead of 503s, ahead of &lt;code>timeout server&lt;/code> expiries, ahead of user complaints.&lt;/p></description></item><item><title>HAProxy reload storm: lingering processes leaking file descriptors and memory</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-reload-storm-process-leak/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-reload-storm-process-leak/</guid><description>&lt;h1 id="haproxy-reload-storm-lingering-processes-leaking-file-descriptors-and-memory">HAProxy reload storm: lingering processes leaking file descriptors and memory&lt;/h1>
&lt;p>You log into the HAProxy host because memory and file descriptor usage have been climbing for days, and you find a dozen haproxy processes running. Only one is serving traffic. The rest are old workers stuck in soft-stop, each holding open connections, connection buffers, and file descriptors it will never release. Traffic looks fine, per-process metrics look fine, and the host is still slowly running out of resources.&lt;/p></description></item><item><title>HAProxy response errors (eresp): truncated and invalid backend responses</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-response-errors-eresp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-response-errors-eresp/</guid><description>&lt;h1 id="haproxy-response-errors-eresp-truncated-and-invalid-backend-responses">HAProxy response errors (eresp): truncated and invalid backend responses&lt;/h1>
&lt;p>The &lt;code>eresp&lt;/code> counter is climbing on a backend, and clients are seeing broken pages, truncated downloads, or intermittent 502s. The backend servers report healthy. Health checks are green. The 5xx rate, if it moved at all, does not explain the volume of user complaints.&lt;/p>
&lt;p>This is the failure mode &lt;code>eresp&lt;/code> exists to capture: HAProxy connected to the backend successfully, sent the request, and then received a response it could not treat as valid. Either the bytes were not parseable HTTP, or the server closed the connection before the response finished. That is a protocol-level failure, not an application returning an error status code, and it needs a different investigation path than a 5xx spike.&lt;/p></description></item><item><title>HAProxy response time (rtime) climbing: slow backends behind the proxy</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-response-time-rtime-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-response-time-rtime-high/</guid><description>&lt;h1 id="haproxy-response-time-rtime-climbing-slow-backends-behind-the-proxy">HAProxy response time (rtime) climbing: slow backends behind the proxy&lt;/h1>
&lt;p>Your HAProxy dashboards show &lt;code>rtime&lt;/code> creeping up on one or more backends. Clients have not started timing out yet, or maybe they just have. HAProxy itself looks fine: CPU is reasonable, no servers are DOWN, error rates are flat or only slightly elevated. But the average time between HAProxy forwarding a request and the backend&amp;rsquo;s first response byte is growing, and it is not coming back down.&lt;/p></description></item><item><title>HAProxy retries and redispatches (wretr/wredis): the backend instability nobody watches</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-retries-redispatches-wretr-wredis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-retries-redispatches-wretr-wredis/</guid><description>&lt;h1 id="haproxy-retries-and-redispatches-wretrwredis-the-backend-instability-nobody-watches">HAProxy retries and redispatches (wretr/wredis): the backend instability nobody watches&lt;/h1>
&lt;p>Your dashboards are clean. No 5xx spike, latency averages look normal, every backend server is UP. Then the backend falls over in what feels like seconds, and the postmortem shows the application was flapping for six hours before the outage. The warning was there the whole time, sitting in two counters almost nobody charts: &lt;code>wretr&lt;/code> and &lt;code>wredis&lt;/code>.&lt;/p>
&lt;p>These counters record HAProxy&amp;rsquo;s built-in compensation mechanism at work. When a connection to a backend server fails, HAProxy does not immediately return an error to the client. It retries. If &lt;code>option redispatch&lt;/code> is set, it can also give up on the original server and dispatch the request to a different one. From the client&amp;rsquo;s perspective the request succeeds, possibly a bit slower. From the proxy&amp;rsquo;s perspective, something in your backend just failed and got papered over.&lt;/p></description></item><item><title>HAProxy run queue rising: task backlog and scheduler pressure</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-run-queue-saturation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-run-queue-saturation/</guid><description>&lt;h1 id="haproxy-run-queue-rising-task-backlog-and-scheduler-pressure">HAProxy run queue rising: task backlog and scheduler pressure&lt;/h1>
&lt;p>HAProxy&amp;rsquo;s event loop processes every connection, request, health check, and timer as tasks scheduled across its threads. When tasks arrive faster than threads can drain them, they pile up in the run queue. That backlog is the earliest internal signal that HAProxy is CPU-saturated: it appears before latency spikes, before backend queuing, and before client timeouts.&lt;/p>
&lt;p>It is also the signal to use when &lt;code>Idle_pct&lt;/code> is meaningless. With &lt;code>busy-polling&lt;/code> enabled, the event loop never sleeps, so &lt;code>Idle_pct&lt;/code> sits near zero by design. The &lt;code>Run_queue&lt;/code> field from &lt;code>show info&lt;/code> and the per-thread counters from &lt;code>show activity&lt;/code> are the replacement.&lt;/p></description></item><item><title>HAProxy scur approaching slim: the concurrent-session saturation signal</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-current-sessions-near-maxconn/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-current-sessions-near-maxconn/</guid><description>&lt;h1 id="haproxy-scur-approaching-slim-the-concurrent-session-saturation-signal">HAProxy scur approaching slim: the concurrent-session saturation signal&lt;/h1>
&lt;p>Your alert says &lt;code>scur&lt;/code> is at 85% of &lt;code>slim&lt;/code> on a frontend, or &lt;code>CurrConns&lt;/code> is closing on &lt;code>Maxconn&lt;/code> in &lt;code>show info&lt;/code>. HAProxy is still up. Traffic is still flowing. But you are running out of concurrent-session headroom, and what happens next depends entirely on which of the four independent limits you are about to hit.&lt;/p>
&lt;p>The danger is that the system still appears responsive: HAProxy is alive and healthy, but clients are about to see queuing delays or 503 rejections. The scur/slim ratio is the warning, if you read it correctly.&lt;/p></description></item><item><title>HAProxy server flapping: rise, fall, and health checks oscillating UP and DOWN</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-server-flapping-up-down/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-server-flapping-up-down/</guid><description>&lt;h1 id="haproxy-server-flapping-rise-fall-and-health-checks-oscillating-up-and-down">HAProxy server flapping: rise, fall, and health checks oscillating UP and DOWN&lt;/h1>
&lt;p>A backend server that alternates between UP and DOWN is worse than one that is cleanly down. Every transition redistributes traffic: when the server goes DOWN its connections move to the survivors, when it comes back UP it absorbs a fresh share of load before it has warmed up, and every cycle costs retries, redispatches, and connection churn. If the flap rate is high enough, the oscillation itself becomes the incident.&lt;/p></description></item><item><title>HAProxy server-template and dynamic backends: monitoring service-discovery routing</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-server-template-dynamic-backends/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-server-template-dynamic-backends/</guid><description>&lt;h1 id="haproxy-server-template-and-dynamic-backends-monitoring-service-discovery-routing">HAProxy server-template and dynamic backends: monitoring service-discovery routing&lt;/h1>
&lt;p>With a static HAProxy config, the server list lives in the config file. Capacity review is config review: count the &lt;code>server&lt;/code> lines and you know what the backend can absorb. With &lt;code>server-template&lt;/code>, the server list lives in DNS. HAProxy pre-provisions a pool of empty server slots, and its internal resolver fills and empties them as A or SRV records change. This is the mechanism behind HAProxy fronting Kubernetes Ingress, Consul, and most autoscaled service-discovery setups.&lt;/p></description></item><item><title>HAProxy show pools: finding which internal pool is consuming memory</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-show-pools-memory-breakdown/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-show-pools-memory-breakdown/</guid><description>&lt;h1 id="haproxy-show-pools-finding-which-internal-pool-is-consuming-memory">HAProxy show pools: finding which internal pool is consuming memory&lt;/h1>
&lt;p>HAProxy&amp;rsquo;s memory footprint is not one number. The process holds dozens of internal object pools: buffers, connections, sessions, tasks, stick-table entries, SSL state. When RSS climbs, when &lt;code>PoolFailed&lt;/code> goes nonzero, or when you are sizing a memory budget for a new instance, the question is never &amp;ldquo;how much memory is HAProxy using&amp;rdquo; but &amp;ldquo;which pool is using it&amp;rdquo;. &lt;code>show pools&lt;/code> is the runtime API command that answers that.&lt;/p></description></item><item><title>HAProxy Slowloris and idle-connection pile-up: high scur, low request rate</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-slowloris-idle-connections/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-slowloris-idle-connections/</guid><description>&lt;h1 id="haproxy-slowloris-and-idle-connection-pile-up-high-scur-low-request-rate">HAProxy Slowloris and idle-connection pile-up: high scur, low request rate&lt;/h1>
&lt;p>Your HAProxy frontend shows &lt;code>scur&lt;/code> pinned at or near &lt;code>slim&lt;/code>, but &lt;code>req_rate&lt;/code> is a fraction of what those connections should be producing. Throughput (&lt;code>bin&lt;/code>/&lt;code>bout&lt;/code>) is near zero, backend queue depth (&lt;code>qcur&lt;/code>) is zero because backends are doing nothing, and &lt;code>ereq&lt;/code> with 408 responses is climbing. HAProxy is not down. It is not slow. It is full: thousands of connections are holding session slots open and sending data so slowly they may as well be dead.&lt;/p></description></item><item><title>HAProxy SSL certificate expired: total TLS failure and how to catch it first</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-ssl-certificate-expired/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-ssl-certificate-expired/</guid><description>&lt;h1 id="haproxy-ssl-certificate-expired-total-tls-failure-and-how-to-catch-it-first">HAProxy SSL certificate expired: total TLS failure and how to catch it first&lt;/h1>
&lt;p>Every client connecting to the affected frontend gets a TLS handshake failure. Not a percentage of clients, not a slow degradation: all of them, immediately, from the moment the certificate&amp;rsquo;s &lt;code>notAfter&lt;/code> timestamp passes. Browsers show &lt;code>NET::ERR_CERT_DATE_INVALID&lt;/code>, API clients throw certificate validation errors, and HAProxy itself is perfectly healthy, running, and passing every process-liveness check you have.&lt;/p>
&lt;p>The mechanism is trivial, the blast radius is total, and HAProxy gives you no built-in metric, counter, or log warning that a certificate is about to expire. If you are reading this during an incident, skip to Quick checks and Fixes. If you are reading it afterward, the Prevention section is the part that matters.&lt;/p></description></item><item><title>HAProxy SSL session cache misses: full handshakes and lost resumption</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-ssl-session-cache-misses/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-ssl-session-cache-misses/</guid><description>&lt;h1 id="haproxy-ssl-session-cache-misses-full-handshakes-and-lost-resumption">HAProxy SSL session cache misses: full handshakes and lost resumption&lt;/h1>
&lt;p>Your HAProxy CPU is climbing but connection counts look normal. &lt;code>Idle_pct&lt;/code> is dropping, latency on new connections is rising, and existing sessions seem fine. When you pull &lt;code>show info&lt;/code>, &lt;code>SslFrontendKeyRate&lt;/code> is far above baseline and the SSL session cache numbers tell the story: almost every lookup is a miss.&lt;/p>
&lt;p>A high cache miss rate means most TLS clients are paying for a full handshake instead of resuming a previous session. Full handshakes are the most CPU-intensive operation HAProxy performs; resumed handshakes skip most of that cost. When resumption breaks, the load balancer loses a large fraction of its capacity without any change in traffic volume.&lt;/p></description></item><item><title>HAProxy SslFrontendKeyRate: the handshake rate that drives CPU cost</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-ssl-frontend-key-rate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-ssl-frontend-key-rate/</guid><description>&lt;h1 id="haproxy-sslfrontendkeyrate-the-handshake-rate-that-drives-cpu-cost">HAProxy SslFrontendKeyRate: the handshake rate that drives CPU cost&lt;/h1>
&lt;p>SslFrontendKeyRate is the number of new (non-resumed) TLS handshakes per second across your HAProxy frontends. Because full TLS handshakes are the most CPU-intensive operation HAProxy performs, this metric is effectively the CPU cost of your TLS traffic expressed as a rate.&lt;/p>
&lt;p>Operators usually look for this metric in two situations: HAProxy CPU is climbing and they need to know whether TLS is the cause, or they are doing capacity planning and need a defensible number for &amp;ldquo;how many handshakes per second can this box absorb.&amp;rdquo; Both depend on understanding what the metric counts, where it comes from, and what breaks it.&lt;/p></description></item><item><title>HAProxy stick-table overflow: rate limiting that silently stops working</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-stick-table-overflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-stick-table-overflow/</guid><description>&lt;h1 id="haproxy-stick-table-overflow-rate-limiting-that-silently-stops-working">HAProxy stick-table overflow: rate limiting that silently stops working&lt;/h1>
&lt;p>Your HAProxy config has rate limiting. It has session persistence. Both are enforced by stick tables, and both can stop working without an error counter, a log line, or a page.&lt;/p>
&lt;p>Stick tables are fixed-size, in-memory key-value stores. When a table reaches its configured &lt;code>size&lt;/code>, HAProxy has two possible behaviors and neither one alerts you. With the default configuration, HAProxy flushes expired entries to make room for new ones. If the table is full of entries that have not yet expired, new entries are refused. With the &lt;code>nopurge&lt;/code> option, eviction is disabled entirely and new entries are silently rejected. In both paths, whatever the table was doing (rate limiting, sticky sessions, abuse tracking) degrades or stops for affected clients.&lt;/p></description></item><item><title>HAProxy stuck in soft-stop: draining connections and hard-stop-after</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-soft-stop-draining-stuck/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-soft-stop-draining-stuck/</guid><description>&lt;h1 id="haproxy-stuck-in-soft-stop-draining-connections-and-hard-stop-after">HAProxy stuck in soft-stop: draining connections and hard-stop-after&lt;/h1>
&lt;p>You reloaded HAProxy minutes ago, but &lt;code>pgrep haproxy&lt;/code> still shows two, three, maybe a dozen PIDs. The old process is not serving new traffic, but it refuses to die. Memory and file descriptor usage on the host keep climbing with every reload, and your monitoring loses counter history each time it happens.&lt;/p>
&lt;p>The old process is in soft-stop: it has unbound from its listeners and is waiting for its existing connections to close before exiting. A drain of a few seconds to a couple of minutes is normal. A process draining for more than 10 minutes is stuck, and the cause is almost always long-lived connections (WebSocket, Server-Sent Events, gRPC streaming, or plain TCP keepalive sessions) that have no reason to close on their own.&lt;/p></description></item><item><title>HAProxy TLS handshake failures: broken clients after a cert or cipher change</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-tls-handshake-failures/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-tls-handshake-failures/</guid><description>&lt;h1 id="haproxy-tls-handshake-failures-broken-clients-after-a-cert-or-cipher-change">HAProxy TLS handshake failures: broken clients after a cert or cipher change&lt;/h1>
&lt;p>A certificate rotation or TLS policy change goes out, HAProxy reloads cleanly, health checks pass, traffic graphs look normal, and then the tickets start: a subset of clients can no longer connect. The load balancer itself is fine. The handshake rate even looks normal. What changed is the failure rate &lt;em>within&lt;/em> handshakes, and HAProxy has no dedicated stats counter that shows it to you directly.&lt;/p></description></item><item><title>HAProxy TLS handshake storm: new-connection floods that saturate the event loop</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-tls-handshake-storm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-tls-handshake-storm/</guid><description>&lt;h1 id="haproxy-tls-handshake-storm-new-connection-floods-that-saturate-the-event-loop">HAProxy TLS handshake storm: new-connection floods that saturate the event loop&lt;/h1>
&lt;p>Traffic looks normal at the TCP layer. Connections are arriving, the frontend is accepting them, but latency is climbing, some clients time out before ever sending a request, and backend servers look healthy. When you check &lt;code>show info&lt;/code>, &lt;code>Idle_pct&lt;/code> is near zero and &lt;code>SslFrontendKeyRate&lt;/code> is far above anything you have tested. You are in a TLS handshake storm: HAProxy is burning every CPU cycle on cryptographic handshake work and the event loop has nothing left for the rest of the pipeline.&lt;/p></description></item><item><title>HAProxy Too many open files: file descriptor exhaustion and refused connections</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-too-many-open-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-too-many-open-files/</guid><description>&lt;h1 id="haproxy-too-many-open-files-file-descriptor-exhaustion-and-refused-connections">HAProxy Too many open files: file descriptor exhaustion and refused connections&lt;/h1>
&lt;p>HAProxy is refusing new connections. Clients see connection timeouts or resets, health checks start failing for no application reason, and the logs show &lt;code>Too many open files&lt;/code>. The process is alive and CPU looks fine, which makes this confusing the first time you hit it: nothing is overloaded in the usual sense. The proxy has run out of file descriptors.&lt;/p></description></item><item><title>HAProxy tune.bufsize and 400 errors: buffers too small for large headers</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-tune-bufsize-large-headers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-tune-bufsize-large-headers/</guid><description>&lt;h1 id="haproxy-tunebufsize-and-400-errors-buffers-too-small-for-large-headers">HAProxy tune.bufsize and 400 errors: buffers too small for large headers&lt;/h1>
&lt;p>Your frontend 400 rate just spiked. The backends insist they never saw the requests, and they are telling the truth: HAProxy generated these 400s itself, during header parsing, before any backend was selected. The usual trigger is a request header block that no longer fits in the per-connection buffer, and the usual suspects are large cookies, JWT bearer tokens, or a newly added header that pushed total header size past the limit.&lt;/p></description></item><item><title>How HAProxy actually works in production: a mental model for operators</title><link>https://www.netdata.cloud/guides/haproxy/haproxy-how-it-works-in-production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/haproxy/haproxy-how-it-works-in-production/</guid><description>&lt;h1 id="how-haproxy-actually-works-in-production-a-mental-model-for-operators">How HAProxy actually works in production: a mental model for operators&lt;/h1>
&lt;p>Most HAProxy incidents come from an operator applying the wrong mental model: treating HAProxy like a web server, like nginx, or like a black box that either works or does not. HAProxy is an event-driven state machine that multiplexes hundreds of thousands of connections across a small number of threads, and almost every confusing symptom traces back to one of a handful of internal mechanisms: the accept pipeline, the maxconn hierarchy, the buffer and connection pools, the health check engine, or a subsystem you forgot was running.&lt;/p></description></item></channel></rss>