最近在学习 Nginx 源码,了解到 Nginx 的基础架构,单个 master 进程管理多个 worker 进程,一般情况下,worker 进程的数量与服务器上的 CPU 核心数相等,并且配置中可以设定将 worker 进程绑定到特定核心上,这样可以利用服务器的SMP 多核架构,实现多核并发处理,避免了进程切换带来的损耗。比如四核机器上可以这样配置:
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
在 worker 进程初始化函数 ngx_worker_process_init() 中获取绑核的配置,然后执行绑核操作;在 FreeBSD 系统中的 API 为 cpuset_setaffinity(),在 Linux 系统中的调用为 sched_setaffinity()。
if (worker >= 0) {
cpu_affinity = ngx_get_cpu_affinity(worker);
if (cpu_affinity) {
ngx_setaffinity(cpu_affinity, cycle->log);
}
}
在嵌入式研发工作中,也可以使用绑核操作,比如将关键服务或进程绑定到第一个核心上,其他进程避开该核心,可以保证关键服务(比如配置下发服务进程、监控进程等)顺畅执行没有卡顿。
参考链接: