配置示例:
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。
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 [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
- 使用指定的CPU亲和性运行一个新程序
taskset [-c] mask command [arg]…
举例:使用CPU0运行ls命令显示/etc/init.d下的所有内容
taskset -c 0 ls -al /etc/init.d/
- 显示已经运行的进程的CPU亲和性
taskset -p pid
举例:查看init进程(PID=1)的CPU亲和性
taskset -p 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)]