常常感觉系统资源不够用,一台机子上跑了不下3个比较重要的服务,但是每天我们还要在上面进行个备份压缩等处理,网络长时间传输,这在就很影响本就不够用的系统资源;
这个时候我们就可以把一些不太重要的比如copy/备份/同步等工作限定在一颗cpu上,或者是多核的cpu的一颗核心上进行处理,虽然这不一定是最有效的方法,但可以最大程度上利用了有效资源,降低那些不太重要的进程占用cpu资源;
查看系统下cpu信息: cat /proc/cpuinfo
taskset就可以帮我们完成这项工作,而且操作非常简单;
利用 taskset 可以充分利用多核cpu的好处,可以让某个程序或脚本,运行在某个具体的cpu上。
这个工具系统可能没有默认安装:,rpm包名util-Linux
#taskset --help
taskset (util-linux 2.13-pre7)
usage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]
set or get the affinity of a process
-p, –pid operate on existing given pid
-c, –cpu-list display and specify cpus in list format
-h, –help display this help
-v, –version output version information
查看pid和哪个CPU亲和:
taskset -pc pid
例子:
taskset -pc 3687
返回pid 3687‘s current affinity list:0,1,2,3
taskset -pc 0-1 3687或者taskset -pc 0,1 3687
设置线程3678和0,1两个cpu内核亲和
1)显示进程运行的CPU
命令taskset -p 21184
显示结果:
pid 21184‘s current affinity mask: ffffff
注:21184是redis-server运行的pid
显示结果的ffffff实际上是二进制24个低位均为1的bitmask,每一个1对应于1个CPU,表示该进程在24个CPU上运行
1:让某个程序运行在特定cpu上面
taskset -c 0 sh wade.sh
2:切换某个进程到特定的cpu上。
taskset -pc 0 12345
比如你有一个cpu是4 core你可以这样写你的脚本
#!/bin/bash
taskset -c 0 sh a.sh &
taskset -c 1 sh b.sh &
taskset -c 2 sh c.sh &
taskset -c 3 sh d.sh &
应该可以充分利用你的cpu了。
对运行中的进程,文档上说可以用下面的命令,把CPU#1 #2 #3分配给PID为2345的进程:
# taskset -cp 1,2,3 2345
但我尝试没奏效,于是我关掉了MySQL,并用taskset将它启动:
# taskset -c 1,2,3 /etc/init.d/mysql start
二、配置nginx绑定CPU
刚才说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;
这里0010 0100 1000是掩码,分别代表第2、3、4颗cpu核心。
重启nginx后,3个工作进程就可以各自用各自的CPU了。
应用实例:
在一台多核 CPU 的 Web 服务器上,存在负载不均衡问题,其中 CPU0 的负载明显高于其它 CPUx,进一步调查表明 PHP-FPM 的嫌疑很大。话说以前我曾经记录过软中断导致过类似的问题,但是本例中可以排除嫌疑。本文出自 “梦想照进现实” 博客,请务必保留此出处http://lookingdream.blog.51cto.com/5177800/1949456
原文地址:http://lookingdream.blog.51cto.com/5177800/1949456