From c20229dff1ae616db08045ef63b8d69dc18d6e96 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 1 Mar 2009 08:35:41 +0100 Subject: [PATCH] [BUG] global.tune.maxaccept must be limited even in mono-process mode On overloaded systems, it sometimes happens that hundreds or thousands of incoming connections are queued in the system's backlog, and all get dequeued at once. The problem is that when haproxy processes them and does not apply any limit, this can take some time and the internal date does not progress, resulting in wrong timer measures for all sessions. The most common effect of this is that all of these sessions report a large request time (around several hundreds of ms) which is in fact caused by the time spent accepting other connections. This might happen on shared systems when the machine swaps. For this reason, we finally apply a reasonable limit even in mono-process mode. Accepting 100 connections at once is fast enough for extreme cases and will not cause that much of a trouble when the system is saturated. (cherry picked from commit f49d1df25cf794b8801d919fda20266d90981c78) (cherry picked from commit d80d63b6df4fe2d8711a83f88c51a7e3a0e139ed) --- doc/configuration.txt | 4 ++-- src/haproxy.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/configuration.txt b/doc/configuration.txt index 95be3d9c2..adb9d2d3a 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -224,10 +224,10 @@ tune.maxaccept Sets the maximum number of consecutive accepts that a process may perform on a single wake up. High values give higher priority to high connection rates, while lower values give higher priority to already established connections. - This value is unlimited by default in single process mode. However, in + This value is limited to 100 by default in single process mode. However, in multi-process mode (nbproc > 1), it defaults to 8 so that when one process wakes up, it does not take all incoming connections for itself and leaves a - part of them to other processes. Setting this value to zero or less disables + part of them to other processes. Setting this value to -1 completely disables the limitation. It should normally not be needed to tweak this value. tune.maxpollevents diff --git a/src/haproxy.c b/src/haproxy.c index f11b78638..8cecf0726 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -562,11 +562,11 @@ void init(int argc, char **argv) if (global.tune.maxpollevents <= 0) global.tune.maxpollevents = MAX_POLL_EVENTS; - if (global.tune.maxaccept <= 0) { + if (global.tune.maxaccept == 0) { if (global.nbproc > 1) global.tune.maxaccept = 8; /* leave some conns to other processes */ else - global.tune.maxaccept = -1; /* accept all incoming conns */ + global.tune.maxaccept = 100; /* accept many incoming conns at once */ } if (arg_mode & (MODE_DEBUG | MODE_FOREGROUND)) {