绑定进程的CPU核以及限制进程的CPU使用率

在测试程序的性能时,需要对进程运行的CPU进行绑定,甚至需要测试进程只使用部分CPU资源时能达到的性能。比如,你可能需要测试某程序在只用一个核的80%CPU资源时的延时。
本文主要总结采用taskset和cpulimit工具来实现目标。

1. 使用taskset绑定进程CPU

taskset使绑定进程CPU的工具,使用方式如下:

taskset -c 1 ./command. 执行command命令,并将command启动的进程绑定到第1个核上。
taskset -pc 3  pid    表示将进程pid绑定到第3个核上

网上很多人多用了上述命令绑定进程到一个核以后发现CPU占用率还是超了100%。这里原因是你当前的进程可能起了多个线程,是上述的方式就不能把线程也绑定进去。如果需要把该进程的所有线程都绑定到与线程相同的核上,需要添加参数a(a表示all)。使用姿势如下:

 taskset -a -pc 3 pid  表示将进程pid(包括所有线程)绑定到第3个核上

Tips: 如果想查看当前进程所属的CPU,可以用如下方式:

taskset -cp pid查看进程所属核

同理,如果还想更进一步查看线程的绑定关系,也需要添加a选项

taskset -acp pid查看进程及所有线程的所属核

通过以上方式完成进程在指定核上的绑定。

2. 使用cpulimit限制进程的CPU使用率

cpulimit源码下载地址:https://sourceforge.net/p/cpulimit/wiki/Home/
下载完成后编译

cd cpulimit-1.1
make
sudo cp cpulimit /usr/bin

cpulimit的使用非常简单:

cpulimit -p $pid -l 50  把进程pid的CPU资源使用率限制为不超过50%

Tips: 如果当前进程运行在多个核上,则cpulimit会限制一个核的使用率都为50%。

3. 测试

使用以上两个工具就能完成对程序限制CPU的性能测试,可编写一个简单的shell脚本实现,例子如下:

 ./benchmark_test  >result.txt 2>&1 &   #把测试程序放到后台运行
pid=$! #获取上一条指令的pid
#pid=$(pgrep -f "benchmark_test")
echo "benchmark pid: $pid"

taskset -acp 4 $pid
cpulimit -p $pid -l 10

最后,当CPU上同时运行很多任务时,也可以通过nice/renice改变进程的优先级来控制CPU资源的利用率,不过这样不能限制CPU的百分比。

Reference:
https://www.techforgeek.info/how_to_limit_cpu_usage.html
http://weyo.me/pages/techs/linux-get-pid/

你可能感兴趣的:(工具)