Linux 下进程线程绑定到指定 CPU 核心以提高性能

最近在学习 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);
        }
    }

在嵌入式研发工作中,也可以使用绑核操作,比如将关键服务或进程绑定到第一个核心上,其他进程避开该核心,可以保证关键服务(比如配置下发服务进程、监控进程等)顺畅执行没有卡顿。

参考链接:

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 注销 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 注销 /  更改 )

Connecting to %s

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理