From: Olivier Houchard Date: Thu, 26 Mar 2026 15:53:47 +0000 (+0100) Subject: MINOR: connections: Enhance tune.idle-pool.shared X-Git-Tag: v3.4-dev8~99 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=506cfcb5d40695e55b2f914b129afe01fe9258c1;p=thirdparty%2Fhaproxy.git MINOR: connections: Enhance tune.idle-pool.shared There are two settings to control idle connection sharing across threads. tune.idle-pool.shared, that enables or disables it, and then tune.takeover-other-tg-connections, which lets you or not get idle connections from other thread groups. Add a new keyword for tune.idle-pool.shared, "full", that lets you get connections from other thread groups (equivalent to "full" keyword for tune.takeover-other-tg-connections). The "on" keyword now will be equivalent to the "restrict" one, which allowed getting connection from other thread groups only when not doing it would result in a connection failure (when reverse-http or when strict-macxonn are used). tune.takeover-other-tg-connections will be deprecated. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index c50240f81..cf9363193 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -4636,22 +4636,22 @@ tune.http.maxhdr protocols. This limit is large enough but not documented on purpose. The same limit is applied on the first steps of the decoding for the same reason. -tune.idle-pool.shared { on | off } - Enables ('on') or disables ('off') sharing of idle connection pools between - threads for a same server. The default is to share them between threads in - order to minimize the number of persistent connections to a server, and to - optimize the connection reuse rate. But to help with debugging or when +tune.idle-pool.shared { auto | on | off } + Controls sharing idle connection pools between threads for a same server. + It can be enabled for all threads in a same thread group ('on'), enabled for + all threads ('full') or disabled ('off'). The default is to share them + between threads in the same thread group ('on'), in order to minimize the + number of persistent connections to a server, and to optimize the connection + reuse rate. Sharing with threads from other thread groups can have a + performance impact, and is not enabled by default, but can be useful if + maximizing connection reuse is a priority. To help with debugging or when suspecting a bug in HAProxy around connection reuse, it can be convenient to - forcefully disable this idle pool sharing between multiple threads, and force - this option to "off". The default is on. It is strongly recommended against - disabling this option without setting a conservative value on "pool-low-conn" - for all servers relying on connection reuse to achieve a high performance - level, otherwise connections might be closed very often as the thread count - increases. Note that in any case, connections are only shared between threads - of the same thread group. This means that systems with many NUMA nodes may - show slightly more persistent connections while machines with unified caches - and many CPU cores per node may experience higher CPU usage. In the latter - case, the "max-thread-per-group" tunable may be used to improve the behavior. + forcefully disable this idle pool sharing between multiple threads, + and force this option to "off". It is strongly recommended against disabling + this option without setting a conservative value on "pool-low-conn" for all + servers relying on connection reuse to achieve a high performance level, + otherwise connections might be closed very often as the thread count + increases. tune.idletimer Sets the duration after which HAProxy will consider that an empty buffer is @@ -5587,6 +5587,9 @@ tune.takeover-other-tg-connections connections. Note that using connections from other thread groups can occur performance penalties, so it should not be used unless really needed. + Note that this behavior is now controlled by tune.idle-pool.shared, and + this keyword is just there for compatibility with older configurations, and + will be deprecated. tune.vars.global-max-size tune.vars.proc-max-size diff --git a/src/server.c b/src/server.c index ddcdbd9ad..58ccb5036 100644 --- a/src/server.c +++ b/src/server.c @@ -7623,7 +7623,7 @@ static void srv_close_idle_conns(struct server *srv) REGISTER_SERVER_DEINIT(srv_close_idle_conns); -/* config parser for global "tune.idle-pool.shared", accepts "on" or "off" */ +/* config parser for global "tune.idle-pool.shared", accepts "full", "on" or "off" */ static int cfg_parse_idle_pool_shared(char **args, int section_type, struct proxy *curpx, const struct proxy *defpx, const char *file, int line, char **err) @@ -7631,12 +7631,17 @@ static int cfg_parse_idle_pool_shared(char **args, int section_type, struct prox if (too_many_args(1, args, err, NULL)) return -1; - if (strcmp(args[1], "on") == 0) + if (strcmp(args[1], "full") == 0) { global.tune.options |= GTUNE_IDLE_POOL_SHARED; - else if (strcmp(args[1], "off") == 0) + global.tune.tg_takeover = FULL_THREADGROUP_TAKEOVER; + } else if (strcmp(args[1], "on") == 0) { + global.tune.options |= GTUNE_IDLE_POOL_SHARED; + global.tune.tg_takeover = RESTRICTED_THREADGROUP_TAKEOVER; + } else if (strcmp(args[1], "off") == 0) { global.tune.options &= ~GTUNE_IDLE_POOL_SHARED; - else { - memprintf(err, "'%s' expects either 'on' or 'off' but got '%s'.", args[0], args[1]); + global.tune.tg_takeover = NO_THREADGROUP_TAKEOVER; + } else { + memprintf(err, "'%s' expects 'auto', 'on' or 'off' but got '%s'.", args[0], args[1]); return -1; } return 0;