压缩大文件时如何限制CPU使用率?—-几种CPU资源限制方法的测试说明

服务器

浏览数:109

2020-6-8

一、说明

我们的MySQL实例在备份后需要将数据打包压缩,部分低配机器在压缩时容易出现CPU打满导致报警的情况,需要在压缩文件时进行CPU资源的限制。

因此针对此问题进行了相关测试,就有了此文章。

二、测试过程

0. 正常打包

正常打包压缩操作:

[root@mysql-test data1]$ du -sh 5555
34G     5555
[root@mysql-test data1]$ tar -czf 5555.tar.gz 5555

打包压缩过程中的CPU占用:

1. nice 命令打包

nice 命令用于设定进程的优先级,取值范围[-20,19],-20为最高,19为最低。

使用nice命令:

[root@mysql-test data1]$ du -sh 5555
34G     5555
[root@mysql-test data1]$ nice -n 19 tar -czf 5555.tar.gz 5555

过程中CPU占用:

  • 第4列 NI 列为19,表示优先级,此时已经是使用了最低优先级
  • 由于平时并没有太多的任务进行(夜间备份期间更是如此),因此即使设置了最低优先级,依旧占用CPU较高

2. cpulimit 命令打包

cpulimit 可以为进程设置CPU使用率上限值并实时监控,若超出上限则暂停运行一段时间

使用该命令需要先进行安装:

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

a. 安装后使用如下命令测试:

cpulimit -l 60 tar -czf 5555.tar.gz 5555         # 限制进程CPU占用率上限为60%

结果如下:

  • cpulimit 只针对单个进程进行限制,而gzip是另一个子进程,因此无效

b. 同时限制子进程

使用cpulimit的-i参数可以同时限制其子进程的资源占用:

cpulimit -i -l 60 tar -czf 5555.tar.gz 5555

其gzip子进程也成功限制:

c. 使用进程号进行限制:

如果无法在命令上使用cpulimit,比如进程已经在跑了,还可以指定进程号进行限制:

先进行正常打包压缩操作:

tar -czf 5555.tar.gz 5555

找到该任务的gzip进程,使用cpulimit:

[root@mysql-test data1]$ cpulimit -l 60 -p 1695
Process 1695 found

CPU使用率被限制在60%:

3. cgroups 命令集

Linux 内核提供的一种机制,利用它可以指定一组进程的资源分配,不限于CPU

该命令只在多个进程争抢资源时才生效,因此在此不再测试,有兴趣同学可自行研究,或参考最后链接的文章。

三、结论对比

  • nicecgroups 命令适用于多个进程任务争抢CPU资源时,进行资源的分配与限制;而只有单一进程任务时依旧会最大限度占用资源
  • cpulimit 针对单个进程生效,可以设定单个进程对CPU资源的使用率上限

四、参考文章

http://www.linuxidc.com/Linux/2015-01/112382.htm

五、附(2017.10.31更新,感谢评论区兄弟提醒)

cpulimit命令的 -i 参数可以同时针对子进程也进行限制,无需再另外指定进程号,用法如下:

cpulimit -i -l 60 tar -czf 5555.tar.gz 5555

作者:o翡翠谷o