关于worker进程绑定CPU的细节
配置:
worker_processes 2;
worker_cpu_affinity 01 10;
linux,NGX_HAVE_SCHED_SETAFFINITY宏,sched.h
typedef cpu_set_t ngx_cpuset_t;
如果worker_cpu_affinity后面是auto,
CPU_ZERO(&mask[0]);
for (i = 0; i < (ngx_uint_t) ngx_min(ngx_ncpu, CPU_SETSIZE); i++) {
CPU_SET(i, &mask[0]);
}
mask[0]中所有cpu都置位,n = 2从auto后面的参数开始解析
否则n = 1,从worker_cpu_affinity后面的参数解析
for ( /* void */ ; n < cf->args->nelts; n++) {
要求每个参数的长度都小于等于CPU_SETSIZE(不大于cpu核数)
解析参数的每一位,如果是1,就设置该编号的cpu,CPU_SET(i - 1, &mask[n - 1]);
结合本例,最终的结果是mask[0]设置了1号cpu,mask[1]设置了0号cpu
Breakpoint 23, ngx_get_cpu_affinity (n=0) at src/core/nginx.c:1374
1374 ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,
(gdb) bt
#0 ngx_get_cpu_affinity (n=0) at src/core/nginx.c:1374
#1 0x0000000000450967 in ngx_worker_process_init (cycle=0x72d530, worker=0) at src/os/unix/ngx_process_cycle.c:854
#2 0x00000000004503f1 in ngx_worker_process_cycle (cycle=0x72d530, data=0x0) at src/os/unix/ngx_process_cycle.c:734
#3 0x000000000044cca6 in ngx_spawn_process (cycle=0x72d530, proc=0x4503b0 <ngx_worker_process_cycle>, data=0x0,
name=0x4dcfcb "worker process", respawn=-3) at src/os/unix/ngx_process.c:198
#4 0x000000000044f2e1 in ngx_start_worker_processes (cycle=0x72d530, n=2, type=-3) at src/os/unix/ngx_process_cycle.c:358
#5 0x000000000044e894 in ngx_master_process_cycle (cycle=0x72d530) at src/os/unix/ngx_process_cycle.c:130
#6 0x000000000040ba95 in main (argc=5, argv=0x7fffffffe6c8) at src/core/nginx.c:367
(gdb)
当启动了worker进程,会调用ngx_get_cpu_affinity取配置,参数n是worker的序号
如果配置了auto,ccf->cpu_affinity_auto,在CPU_SETSIZE个cpu组成的环形队列上,从0开始,循环移动n个cpu被置位的元素,
如果某个cpu没有被置位,则不算移动一个,接着往下移动,直到移动到被置位的cpu,才算一个,还没完,要这样做n次。
取第n + 1个cpu
如果不是auto,返回ccf->cpu_affinity[n],worker0返回mask[0], worker0返回mask[1]
NGX_HAVE_SCHED_SETAFFINITY
sched_setaffinity(0, sizeof(cpu_set_t), cpu_affinity)
制定了当前进程只能在cpu_affinity指定的cpu上运行
(gdb) bt
#0 ngx_get_cpu_affinity (n=0) at src/core/nginx.c:1404
#1 0x0000000000450967 in ngx_worker_process_init (cycle=0x72d530, worker=0) at src/os/unix/ngx_process_cycle.c:854
#2 0x00000000004503f1 in ngx_worker_process_cycle (cycle=0x72d530, data=0x0) at src/os/unix/ngx_process_cycle.c:734
#3 0x000000000044cca6 in ngx_spawn_process (cycle=0x72d530, proc=0x4503b0 <ngx_worker_process_cycle>, data=0x0,
name=0x4dcfcb "worker process", respawn=-3) at src/os/unix/ngx_process.c:198
#4 0x000000000044f2e1 in ngx_start_worker_processes (cycle=0x72d530, n=2, type=-3) at src/os/unix/ngx_process_cycle.c:358
#5 0x000000000044e894 in ngx_master_process_cycle (cycle=0x72d530) at src/os/unix/ngx_process_cycle.c:130
#6 0x000000000040ba95 in main (argc=5, argv=0x7fffffffe6c8) at src/core/nginx.c:367
配置:
worker_processes 2;
worker_cpu_affinity 01 10;
linux,NGX_HAVE_SCHED_SETAFFINITY宏,sched.h
typedef cpu_set_t ngx_cpuset_t;
如果worker_cpu_affinity后面是auto,
CPU_ZERO(&mask[0]);
for (i = 0; i < (ngx_uint_t) ngx_min(ngx_ncpu, CPU_SETSIZE); i++) {
CPU_SET(i, &mask[0]);
}
mask[0]中所有cpu都置位,n = 2从auto后面的参数开始解析
否则n = 1,从worker_cpu_affinity后面的参数解析
for ( /* void */ ; n < cf->args->nelts; n++) {
要求每个参数的长度都小于等于CPU_SETSIZE(不大于cpu核数)
解析参数的每一位,如果是1,就设置该编号的cpu,CPU_SET(i - 1, &mask[n - 1]);
结合本例,最终的结果是mask[0]设置了1号cpu,mask[1]设置了0号cpu
Breakpoint 23, ngx_get_cpu_affinity (n=0) at src/core/nginx.c:1374
1374 ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,
(gdb) bt
#0 ngx_get_cpu_affinity (n=0) at src/core/nginx.c:1374
#1 0x0000000000450967 in ngx_worker_process_init (cycle=0x72d530, worker=0) at src/os/unix/ngx_process_cycle.c:854
#2 0x00000000004503f1 in ngx_worker_process_cycle (cycle=0x72d530, data=0x0) at src/os/unix/ngx_process_cycle.c:734
#3 0x000000000044cca6 in ngx_spawn_process (cycle=0x72d530, proc=0x4503b0 <ngx_worker_process_cycle>, data=0x0,
name=0x4dcfcb "worker process", respawn=-3) at src/os/unix/ngx_process.c:198
#4 0x000000000044f2e1 in ngx_start_worker_processes (cycle=0x72d530, n=2, type=-3) at src/os/unix/ngx_process_cycle.c:358
#5 0x000000000044e894 in ngx_master_process_cycle (cycle=0x72d530) at src/os/unix/ngx_process_cycle.c:130
#6 0x000000000040ba95 in main (argc=5, argv=0x7fffffffe6c8) at src/core/nginx.c:367
(gdb)
当启动了worker进程,会调用ngx_get_cpu_affinity取配置,参数n是worker的序号
如果配置了auto,ccf->cpu_affinity_auto,在CPU_SETSIZE个cpu组成的环形队列上,从0开始,循环移动n个cpu被置位的元素,
如果某个cpu没有被置位,则不算移动一个,接着往下移动,直到移动到被置位的cpu,才算一个,还没完,要这样做n次。
取第n + 1个cpu
如果不是auto,返回ccf->cpu_affinity[n],worker0返回mask[0], worker0返回mask[1]
NGX_HAVE_SCHED_SETAFFINITY
sched_setaffinity(0, sizeof(cpu_set_t), cpu_affinity)
制定了当前进程只能在cpu_affinity指定的cpu上运行
(gdb) bt
#0 ngx_get_cpu_affinity (n=0) at src/core/nginx.c:1404
#1 0x0000000000450967 in ngx_worker_process_init (cycle=0x72d530, worker=0) at src/os/unix/ngx_process_cycle.c:854
#2 0x00000000004503f1 in ngx_worker_process_cycle (cycle=0x72d530, data=0x0) at src/os/unix/ngx_process_cycle.c:734
#3 0x000000000044cca6 in ngx_spawn_process (cycle=0x72d530, proc=0x4503b0 <ngx_worker_process_cycle>, data=0x0,
name=0x4dcfcb "worker process", respawn=-3) at src/os/unix/ngx_process.c:198
#4 0x000000000044f2e1 in ngx_start_worker_processes (cycle=0x72d530, n=2, type=-3) at src/os/unix/ngx_process_cycle.c:358
#5 0x000000000044e894 in ngx_master_process_cycle (cycle=0x72d530) at src/os/unix/ngx_process_cycle.c:130
#6 0x000000000040ba95 in main (argc=5, argv=0x7fffffffe6c8) at src/core/nginx.c:367