1. 前言
1.1. 问题及需求
通常如果不加以配置,对于一些密集操作数据库的任务时,会发现Linode服务器的4核CPU,只有第1个核心(CPU#0)非常忙,其他都处于idle状态。
不了解Linux是如何调度的,但目前显然有优化的余地。除了处理正常任务,CPU#0还需要处理每秒网卡中断。因此,若能将CPU#0分担的任务摊派到其他CPU核心上,可以预见,系统的处理能力将有更大的提升。
1.2. 两个名词
-
SMP (Symmetrical Multi-Processing):指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。
-
CPU affinity:中文唤作"CPU亲和力",是指在CMP架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。
2. taskset工具
2.1. 安装taskset工具
1 |
yum install -y util-linux |
2.2. taskset语法
调整进程优先权和利用taskset有效控制cpu资源
- 语法
1 2 |
taskset [options] mask command [arg]... taskset [options] -p [mask] pid |
- 参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Show or change the CPU affinity of a process. Options: -a, --all-tasks operate on all the tasks (threads) for a given pid 操作所有的任务线程 -p, --pid operate on existing given pid 操作已存在的pid -c, --cpu-list display and specify cpus in list format 通过列表显示方式设置CPU(逗号相隔) -V, --version display version 输出版本信息 -h, --help display this help The default behavior is to run a new command: taskset 03 sshd -b 1024 You can retrieve the mask of an existing task: taskset -p 700 Or set it: taskset -p 03 700 List format uses a comma-separated list instead of a mask: taskset -pc 0,3,7-11 700 Ranges in list format can take a stride argument: e.g. 0-31:2 is equivalent to mask 0x55555555 |
2.3. taskset使用示例
-
-V, --version
输出版本信息12$ taskset -Vtaskset from util-linux 2.35.2 -
配置某进程在指定核上运行
-p:在存在的给定pid上操作
-c:以列表的格式显示和指定CPU1234#指定PID为8704的进程在CPU0上运行$ taskset -pc 1 8704pid 8704\'s current affinity list: 0-3pid 8704\'s new affinity list: 1Pid 8724的当前关联列表:0-3
Pid 8724的新关联列表 -
查询pid在那些CPU核心上运行
12$ taskset -pc 8704pid 8704\'s current affinity list: 1 -
查询进程可用CPU核心
使用taskset -p
指定进程号(pid),查询PID(TID)= 10855 的进程可用的CPU核心,掩码形式表示12taskset -p 10855pid 10855\'s current affinity mask: fmask是16进制, f代表15,转为2进制就是1111; 该设备存在4个CPU核心,即表示每个核心均可使用;
0x0F(十六进制) => 1111(二进制),最右起第一个1表示CPU核心#0,第二个1表示CPU核心#1…设置 PID(TID)= 10878 的线程可用的CPU核心到#0、#1、#2、#3上
只要taskset成功返回了,那就表示绑核一定成功了,即该进程已被绑到指定的核上面,而且taskset命令会显示原来的绑核(原来的可能是系统默认分配的核)情况,以及新的绑核情况。 -
运行命令的同时,指定对应CPU核心
taskset -c cpu
核心号 具体执行命令12# 指定第三个核心,运行sshd命令taskset -c 3 sshd -b 1024
3. nginx绑定cpu实验
3.1. 安装依赖包
1 |
yum -y install pcre-devel zlib-devel gcc gcc-c++ make |
3.2. 创建运行用户
1 |
useradd -M -s /sbin/nologin nginx |
3.3. 编译安装
1 2 3 4 5 6 7 8 9 10 11 |
cd /opt tar zxvf nginx-1.12.0.tar.gz -C /opt/''.6hvcf cd nginx-1.12.0/ ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module make && make install |
3.4. 优化路径
1 2 |
# 创建nginx软连接到/usr/local/sbin/目录下 $ ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ |
3.5. 添加nginx系统服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ vim /lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target $ chmod 754 /lib/systemd/system/nginx.service $ systemctl start nginx.service $ systemctl enable nginx.service $ vim /usr/local/nginx/conf/nginx.conf |
3.6. 修改nginx工作内核数
因为nginx提供了更精确的控制。在conf/nginx.conf中,有如下一行:worker_processes 1;
这是用来配置nginx启动几个工作进程的,默认为1。而nginx还支持一个名为worker_cpu_affinity的配置项,也就是说,nginx可以为每个工作进程绑定CPU。我做了如下配置,启动三个工作进程,分别使用对应的CPU核心,通过掩码指定:
1 2 |
worker_processes 3; worker_cpu_affinity 0010 0100 1000; |
3.7. 查询nginx的pid
1 2 3 4 5 6 7 8 |
$ pa -aux |grep nginx # 查看启动80端口的进程号和用户 $ lsof -i:80 # 查看主进程使用了那些CPU核心 taskset -pc 17562 # 查看主进程可使用的核心 taskset -p 17562 |
重启nginx,发现4个服务各自在不同的cpu上运行;
微信赞赏
支付宝赞赏