最近在学习 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); } }
在嵌入式研发工作中,也可以使用绑核操作,比如将关键服务或进程绑定到第一个核心上,其他进程避开该核心,可以保证关键服务(比如配置下发服务进程、监控进程等)顺畅执行没有卡顿。
参考链接:
- https://www.freebsd.org/cgi/man.cgi?query=cpuset_setaffinity&sektion=2&apropos=0&manpath=FreeBSD+7.2-RELEASE
- https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html
- 《深入理解Nginx 模块开发与架构解析》
分类:Development