From: Willy Tarreau Date: Wed, 19 Jul 2023 16:39:32 +0000 (+0200) Subject: BUG/MINOR: init: set process' affinity even in foreground X-Git-Tag: v2.9-dev2~36 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c955659906ffc04b1d3a25ffd2541ef3e5bab0e7;p=thirdparty%2Fhaproxy.git BUG/MINOR: init: set process' affinity even in foreground The per-process CPU affinity settings are only applied during forking, which means that cpu-map are ignored when running in foreground (e.g. haproxy started with -db). This is historic due to the original semantics of a process array, but isn't documented and causes surprises when trying to debug affinity settings. Let's make sure the setting is applied to the workers themselves even in foreground. This may be backported to 2.6 though it is really not important. If backported, it also depends on previous commit: BUG/MINOR: cpuset: remove the bogus "proc" from the cpu_map struct --- diff --git a/src/haproxy.c b/src/haproxy.c index 993fa39398..6b8fdf1583 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -3623,18 +3623,6 @@ int main(int argc, char **argv) in_parent = 1; } -#if !defined(USE_THREAD) && defined(USE_CPU_AFFINITY) - if (!in_parent && ha_cpuset_count(&cpu_map[0].thread[0])) { /* only do this if the process has a CPU map */ - -#if defined(CPUSET_USE_CPUSET) || defined(__DragonFly__) - struct hap_cpuset *set = &cpu_map[0].thread[0]; - sched_setaffinity(0, sizeof(set->cpuset), &set->cpuset); -#elif defined(__FreeBSD__) - struct hap_cpuset *set = &cpu_map[0].thread[0]; - ret = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, sizeof(set->cpuset), &set->cpuset); -#endif - } -#endif /* close the pidfile both in children and father */ if (pidfd >= 0) { //lseek(pidfd, 0, SEEK_SET); /* debug: emulate eglibc bug */ @@ -3775,6 +3763,19 @@ int main(int argc, char **argv) fork_poller(); } + /* Note that here we can't be in the parent/master anymore */ +#if !defined(USE_THREAD) && defined(USE_CPU_AFFINITY) + if (ha_cpuset_count(&cpu_map[0].thread[0])) { /* only do this if the process has a CPU map */ + +#if defined(CPUSET_USE_CPUSET) || defined(__DragonFly__) + struct hap_cpuset *set = &cpu_map[0].thread[0]; + sched_setaffinity(0, sizeof(set->cpuset), &set->cpuset); +#elif defined(__FreeBSD__) + struct hap_cpuset *set = &cpu_map[0].thread[0]; + ret = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, sizeof(set->cpuset), &set->cpuset); +#endif + } +#endif /* try our best to re-enable core dumps depending on system capabilities. * What is addressed here : * - remove file size limits