引言:我的Linode十分繁忙,在跑一些密集操作数据库的Rake任务时尤其如此。但我观察发现,Linode服务器的4核CPU,只有第1个核心(CPU#0)非常忙,其他都处于idle状态。

不了解Linux是如何调度的,但目前显然有优化的余地。除了处理正常任务,CPU#0还需要处理每秒网卡中断。因此,若能将CPU#0分担的任务摊派到其他CPU核心上,可以预见,系统的处理能力将有更大的提升。

两个名词

SMP (Symmetrical Multi-Processing):指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。

CPU affinity:中文唤作“CPU亲和力”,是指在CMP架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。

1、taskset工具

(1)安装taskset工具

  yum install -y util-linux

 (2)taskset语法

调整进程优先权和利用taskset有效控制cpu资源

语法: 

1.taskset [options] mask command [arg]...
2.taskset [options] -p [mask] pid

参数:

-a, --all-tasks 操作所有的任务线程
-p, --pid 操作已存在的pid
-c, --cpu-list 通过列表显示方式设置CPU(逗号相隔)
-V, --version           输出版本信息

(3)taskset使用示例

(1)-V, --version           输出版本信息

 (2)taskset -a 在给定的pid的所有任务线程上操作

 (3)taskset -pc 1 8704

-p:在存在的给定pid上操作

-c:以列表的格式显示和指定CPU

1:指定的cpu核

8704:指定的pid号

top查看pid

 taskset -pc -1 8704  :指定PID为8704的进程在CPU0上运行

Pid 8724的当前关联列表:0-3 

Pid 8724的新关联列表

(4) taskset -pc 8704

查询pid是否在外面设定的CPU核心上运行

taskset -pc 8704

 (5)taskset -p 指定进程号(pid)

查询PID(TID)= 10855 的进程可用的CPU核心,掩码形式表示

taskset -p 10855

(6)taskset -pc 指定的进程号 (pid)

查询 PID(TID)= 33 的进程可用的CPU核心

taskset -pc 33

 mask是16进制   f代表15  转为2进制就是1111

0x0F(十六进制) => 1111(二进制),最右起第一个1表示CPU核心#0,第二个1表示CPU核心#1…设置 PID(TID)= 10878 的线程可用的CPU核心到#0、#2上

只要taskset成功返回了,那就表示绑核一定成功了,即该进程已被绑到指定的核上面,而且taskset命令会显示原来的绑核(原来的可能是系统默认分配的核)情况,以及新的绑核情况。

2、nginx绑定cpu实验

(1)安装依赖包

yum -y install pcre-devel zlib-devel gcc gcc-c++ make

 (2)创建运行用户

useradd -M -s /sbin/nologin nginx

 (3)编译安装

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

 (4)优化路径

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

(5)添加nginx系统服务

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

(6)修改nginx工作内核数

是因为nginx提供了更精确的控制。

conf/nginx.conf中,有如下一行:

worker_processes  1;

这是用来配置nginx启动几个工作进程的,默认为1。而nginx还支持一个名为worker_cpu_affinity的配置项,也就是说,nginx可以为每个工作进程绑定CPU。我做了如下配置:

worker_processes  3;

worker_cpu_affinity 0010 0100 1000;

 (7)查询nginx的pid

 为重启nginx

 重启nginx,发现4个服务各自在不同的cpu上运行

 修改回来服务在cpu上随机运行

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐