nginx源代码分析 - 启动(六) 关于worker进程绑定CPU的细节

关于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值