MINOR: config: disable busy polling on old processes
authorWilliam Dauchy <w.dauchy@criteo.com>
Sat, 28 Dec 2019 14:36:02 +0000 (15:36 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 9 Jan 2020 16:40:55 +0000 (17:40 +0100)
in the context of seamless reload and busy polling, older processes will
create unecessary cpu conflicts; we can assume there is no need for busy
polling for old processes which are waiting to be terminated.

This patch is not a bug fix itself but might be a good stability
improvment when you are un the context of frequent seamless reloads with
a high "hard-stop-after" value; for that reasons I think this patch
should be backported in all 2.x versions.

Signed-off-by: William Dauchy <w.dauchy@criteo.com>
(cherry picked from commit 3894d97fb8b66e247c5a326c6b3aa75816c597dc)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

doc/configuration.txt
src/proxy.c

index d34ed80..3f381e3 100644 (file)
@@ -1436,6 +1436,10 @@ busy-polling
   prefixing it with the "no" keyword. It is ignored by the "select" and
   "poll" pollers.
 
+  This option is automatically disabled on old processes in the context of
+  seamless reload; it avoids too much cpu conflicts when multiple processes
+  stay around for some time waiting for the end of their current connections.
+
 max-spread-checks <delay in milliseconds>
   By default, haproxy tries to spread the start of health checks across the
   smallest health check interval of all the servers in a farm. The principle is
index 7ba6b58..1abd665 100644 (file)
@@ -1117,6 +1117,8 @@ void soft_stop(void)
        struct task *task;
 
        stopping = 1;
+       /* disable busy polling to avoid cpu eating for the new process */
+       global.tune.options &= ~GTUNE_BUSY_POLLING;
        if (tick_isset(global.hard_stop_after)) {
                task = task_new(MAX_THREADS_MASK);
                if (task) {