Nginx(5):进程绑定CPU:从nginx源码里给你刨功能出来(1)

文章讲述了Nginx配置中关于worker_processes和worker_cpu_affinity的部分,以及如何使用C语言模拟设置进程的CPU亲和性。同时介绍了Linux命令taskset用于管理和查看进程的CPU亲和性。
摘要由CSDN通过智能技术生成

配置示例:

worker_processes 4;

worker_cpu_affinity 0001 0010 0100 1000;

此配置的含义为共启动4个worker进程,第一个进程绑定到系统的第一个逻辑处理器,第二个进程绑定到系统的第二个逻辑处理器,以此类推。另外,也可以将一个进程绑定到多个CPU, 示例如下:

worker_processes 2;

worker_cpu_affinity 0101 1010;

此示例表示启动两个worker进程,其中第一个进程绑定到cpu0/cpu2,第二个进程绑定到cpu1/cpu3。


ngx_set_cpu_affinity


void

ngx_setaffinity(uint64_t cpu_affinity, ngx_log_t *log)

{

cpu_set_t mask;

ngx_uint_t i;

ngx_log_error(NGX_LOG_NOTICE, log, 0,

“sched_setaffinity(0x%08Xl)”, cpu_affinity);

CPU_ZERO(&mask);

i = 0;

do {

if (cpu_affinity & 1) {

CPU_SET(i, &mask);

}

i++;

cpu_affinity >>= 1;

} while (cpu_affinity);

if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) == -1) {

ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,

“sched_setaffinity() failed”);

}

}

函数的功能很简单,从地位到高位遍历cpu_affinity中的位值,如果某位为1,则将对应的CPU设置到CPU集mask中,最后调用sched_setaffinity设置本进程的CPU亲和性,同时,由于采用uint64_t存储转换后的结果,nginx最多只支持64 CPUs的CPU亲和性的配置。


我觉得吧,咱还是自己仿写一个吧,它这里面的参数是需要读配置文件的,咱没有剖析那个源代码。。。

尴尬。。。


仿写一份


将进程绑定到2号CPU上运行

#define _GNU_SOURCE

#include <sched.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

int main(int argc, char **argv)

{

int cpus = 0;

int i = 0;

cpu_set_t mask;

cpu_set_t get;

cpus = sysconf(_SC_NPROCESSORS_ONLN);

printf(“cpus: %d\n”, cpus);

CPU_ZERO(&mask); /* 初始化set集,将set置为空*/

/将本进程绑定到CPU2上/

CPU_SET(2, &mask);

if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {

printf(“Set CPU affinity failue, ERROR:%s\n”, strerror(errno));

return -1;

}

while(1)

{

}

return 0;

}


taskset命令


命令行形式

taskset [options] mask command [arg]…taskset [options] -p [mask] pidPARAMETER

mask : cpu亲和性,当没有-c选项时, 其值前无论有没有0x标记都是16进制的,当有-c选项时,其值是十进制的.

command : 命令或者可执行程序

arg : command的参数

pid : 进程ID,可以通过ps/top/pidof等命令获取

OPTIONS

-a, --all-tasks (旧版本中没有这个选项)

这个选项涉及到了linux中TID的概念,他会将一个进程中所有的TID都执行一次CPU亲和性设置.

TID就是Thread ID,他和POSIX中pthread_t表示的线程ID完全不是同一个东西.

Linux中的POSIX线程库实现的线程其实也是一个进程(LWP),这个TID就是这个线程的真实PID.

-p, --pid

操作已存在的PID,而不是加载一个新的程序

-c, --cpu-list

声明CPU的亲和力使用数字表示而不是用位掩码表示. 例如 0,5,7,9-11.

-h, --help

display usage information and exit

-V, --version

output version information and exit

USAGE

  1. 使用指定的CPU亲和性运行一个新程序

taskset [-c] mask command [arg]…

举例:使用CPU0运行ls命令显示/etc/init.d下的所有内容

taskset -c 0 ls -al /etc/init.d/

  1. 显示已经运行的进程的CPU亲和性

taskset -p pid

举例:查看init进程(PID=1)的CPU亲和性

taskset -p 1

  1. 改变已经运行进程的CPU亲和力

taskset -p[c] mask pid

举例:打开2个终端,在第一个终端运行top命令,第二个终端中

首先运行:[~]# ps -eo pid,args,psr | grep top #获取top命令的pid和其所运行的CPU号

其次运行:[~]# taskset -cp 新的CPU号 pid #更改top命令运行的CPU号

最后运行:[~]# ps -eo pid,args,psr | grep top #查看是否更改成功

PERMISSIONS

最后

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了

CPU号

最后运行:[~]# ps -eo pid,args,psr | grep top #查看是否更改成功

PERMISSIONS

最后

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了

[外链图片转存中…(img-Rl00nYq9-1714432478800)]

[外链图片转存中…(img-cbDYdGnB-1714432478800)]

[外链图片转存中…(img-j3lgN1ls-1714432478800)]

[外链图片转存中…(img-Gpz3XTw9-1714432478801)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值