I am running some code on a system with two processor sockets, and would
prefer for the processes to be restricted to a single socket for the time
being. I have tried to use taskset, but Julia appears to manually set its
own affinity when it starts.
$ taskset -c 0,1,2,3,4,5 julia -q -p 5 &
[1] 13173
$ ps -eF | grep -e 'julia\|PSR'
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
aokano 13173 4626 54 192807 108788 0 09:48 pts/2 00:00:02 julia -q -p
5
aokano 13185 13173 27 114376 71492 6 09:49 ? 00:00:01
/home/aokano/julia/usr/bin/./julia --worker --bind-to 169.237.10.172
aokano 13186 13173 31 131261 73616 9 09:49 ? 00:00:01
/home/aokano/julia/usr/bin/./julia --worker --bind-to 169.237.10.172
aokano 13187 13173 30 123234 74216 8 09:49 ? 00:00:01
/home/aokano/julia/usr/bin/./julia --worker --bind-to 169.237.10.172
aokano 13188 13173 30 123077 73700 2 09:49 ? 00:00:01
/home/aokano/julia/usr/bin/./julia --worker --bind-to 169.237.10.172
aokano 13189 13173 29 126412 87232 5 09:49 ? 00:00:01
/home/aokano/julia/usr/bin/./julia --worker --bind-to 169.237.10.172
aokano 13246 4626 0 1908 1008 0 09:49 pts/2 00:00:00 grep
--color=auto -e julia\|PSR
Note the processor number is shown in the PSR column.
The offending code appears to be this segment of init.c
int ncores = jl_cpu_cores();
if (ncores > 1) {
cpu_set_t cpumask;
CPU_ZERO(&cpumask);
for(int i=0; i < ncores; i++) {
CPU_SET(i, &cpumask);
}
sched_setaffinity(0, sizeof(cpu_set_t), &cpumask);
}
where the function jl_cpu_cores() calls sysconf(_SC_NPROCESSORS_ONLN) to
determine the number of available cores. According to my tests, this
function ignores taskset,
$ cat test.c
#include <stdio.h>
#include <unistd.h>
int main() {
printf("%d\n",sysconf( _SC_NPROCESSORS_ONLN ) );
return 0;
}
$ ./a.out
12
$ taskset -c 0,1,2,3,4,5 ./a.out
12
Long explanation aside, is there any way to set CPU affinity for Julia
processes?