如何在Ubuntu Linux上使用CPULimit限制CPU使用率

如何使用CPULimit在Ubuntu Linux上限制CPU使用

版本1.0
作者:Srijan Kishore
最后编辑 2014年8月25日

本文档描述了如何在Ubuntu 14.04中限制CPU使用率。 为此,我将使用CPU限制用例。 Cpulimit是一种限制进程CPU占用率的工具(以百分比表示,而不是CPU时间)。 当您不希望他们吃太多的CPU周期时,控制批处理作业是很有用的。 cpulimit的目标是防止进程运行超过指定的时间比例。 它不会改变漂亮的值或其他调度优先级设置,而是实际的CPU使用率。 此外,它能够自动适应整个系统的负载,动态和快速。
使用CPU数量的控制是将SIGSTOP和SIGCONT POSIX信号发送到进程。
指定进程的所有子进程和线程将共享相同百分比的CPU。

1初步说明

本教程基于Ubuntu 14.04服务器,因此您应该在继续本教程之前设置基本的Ubuntu 14.04服务器安装。 系统应该有一个静态IP地址。 我在本教程中使用192.168.0.100作为我的IP地址,将server1.example.com用作主机名。

2安装

首先我们需要安装cpulimit,如下所示:
apt-get update
apt-get install cpulimit

3限制CPU使用率

现在我们将检查实用程序来限制CPU使用率。 为此,我们将首先检查CPU使用率,而不使用cpulimit,然后实现cpulimit来进行评估。 让我们以示例清楚。

  1. 以下是在单核CPU中如何利用CPU应用程序的示例:
dd if=/dev/zero of=/dev/null &
root@server1:~# dd if=/dev/zero of=/dev/null &
[1] 1850
root@server1:~#

然后我们将使用命令检查CPU使用情况:

top
top - 11:24:18 up 49 min,  1 user,  load average: 0.94, 1.02, 1.79
Tasks: 249 total,   2 running, 247 sleeping,   0 stopped,   0 zombie
%Cpu(s): 13.4 us, 11.6 sy,  0.0 ni, 74.9 id,  0.0 wa,  0.1 hi,  0.0 si,  0.0 st
KiB Mem:   1010540 total,   271652 used,   738888 free,    21760 buffers
KiB Swap:  1048572 total,        0 used,  1048572 free.   158204 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                   
 1850 root      20   0    7224    616    520 R 100.0  0.1   1:20.33 dd                        
 1851 root      20   0   24952   1756   1180 R   0.3  0.2   0:00.03 top                       
    1 root      20   0   33480   2776   1456 S   0.0  0.3   0:05.31 init                      
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd        

我们可以看到CPU使用率已经达到100%,现在我们将使用cpulimit来限制CPU使用率。 我们可以使用fg将这个进程调到前台,并用CTRL + C取消它

fg
root @ server1:〜#fg
dd if = / dev / zero of = / dev / null
^ C222182151 + 0条记录
222182150 + 0记录
复制了113757260800字节(114 GB),259.084 s,439 MB / s

root @ server1:〜#

现在我们可以测试cpulimit来查看它是否真的做了它应该做的事情。 让它测试如下:

cpulimit -l 30 dd if=/dev/zero of=/dev/null &
root @ server1:〜#cpulimit -l 30 dd if = / dev / zero of = / dev / null&
[1] 1852年
root @ server1:〜#检测到1853进程

[1] +完成cpulimit -l 30 dd if = / dev / zero of = / dev / null
root @ server1:〜#

现在我们将使用top命令检查CPU使用情况:

top
顶部 - 11:30:54上升55分钟,1位用户,负载平均值:0.20,0.58,1.34
任务:共250个,2个运行,247个睡眠,1个停止,0个僵尸
%Cpu(s):4.5 us,4.1 sy,0.0 ni,91.4 id,0.0 wa,0.0 hi,0.0 si,0.0 st
KiB Mem:1010540 total,271944 used,738596 free,21816 buffers
KiB Swap:1048572总数,0使用,1048572免费。 158212缓存Mem

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME + COMMAND
1853根20 0 7224 612 520 T 33.8 0.1 0:35.53 dd
1根20 0 33480 2776 1456 S 0.0 0.3 0:05.37 init
2根20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3根20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd / 0
4根20 0 0 0 0 S 0.0 0.0 0:00.00 kworker / 0:0

现在可以看到CPU的使用率已经从100%下降到了33.8%,几乎是30%。 因此,我们已经成功地检查了在一个核心的Ubuntu发行版中能够限制CPU使用量的实用程序cpulimit。

  1. 下面是一个如何利用CPU在多核心CPU中使用应用程序的示例:

要检查您的CPU内核,请使用以下命令:

nproc   
在我的情况下,CPU核心数是4。
现在我们将继续检查一下应用程序的所有4个内核中没有cpulimit的CPU使用情况,如下所示:
for j in `seq 1 4`; do dd if=/dev/zero of=/dev/null & done
它将使用所有内核运行命令,并输出为:

root @ server1:〜#for j在`seq 1 4`; do dd if = / dev / zero of = / dev / null&done
[1] 1263
[2] 1264
[3] 1265
[4] 1266
root @ server1:〜#
现在使用top命令检查CPU使用情况:
top
顶部 - 11:47:45上升4分钟,1位用户,负载平均值:3.63,1.53,0.57
任务:共290次,5次运行,285次睡眠,0次停止,0次僵尸
%Cpu0:48.3 us,51.3 sy,0.0 ni,0.0 id,0.0 wa,0.3 hi,0.0 si,0.0 st
%Cpu1:47.8 us,52.2 sy,0.0 ni,0.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st
%Cpu2:53.3 us,46.4 sy,0.0 ni,0.0 id,0.0 wa,0.3 hi,0.0 si,0.0 st
%Cpu3:52.0 us,48.0 sy,0.0 ni,0.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st
KiB Mem:1010540 total,209712 used,800828 free,20276 buffers
KiB Swap:1048572总数,0使用,1048572免费。 93632缓存Mem

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME + COMMAND
1263根20 0 7224 612 520 R 100.0 0.1 2:21.40 dd
1264根20 0 7224 616 520 R 100.0 0.1 2:21.41 dd
1265根20 0 7224 612 520 R 99.0 0.1 2:21.03 dd
1266根20 0 7224 616 520 R 98.0 0.1 2:20.82 dd
1281根20 0 104416 3992 2920 S 1.0 0.4 0:00.03 sshd
1283根20 0 104416 3988 2920 S 1.0 0.4 0:00.03 sshd
1279根20 0 104556 4008 2924 S 0.7 0.4 0:00.08 sshd
dd命令占用了所有内核的几乎100%的CPU。接下来,我们将使用cpulimit实用程序检查命令。为了这个杀死dd命令的以前的跟踪如下:

killall dd
root @ server1:〜#killall dd
[1]终止dd if = / dev / zero of = / dev / null
[3] - 终止dd if = / dev / zero of = / dev / null
[2] - 终止dd if = / dev / zero of = / dev / null
[4] + Terminated dd if = / dev / zero of = / dev / null
root @ server1:〜#
现在使用cpulimit与以下相同的命令:
for j in `seq 1 4`; do cpulimit -l 20 dd if=/dev/zero of=/dev/null & done
root @ server1:〜#for j在`seq 1 4`; do cpulimit -l 20 dd if = / dev / zero of = / dev / null&done
[1] 1429
[2] 1430
[3] 1431
[4] 1432
root @ server1:〜#检测到1434进程
检测到过程1433
检测到过程1437
检测到过程1439

[1]完成cpulimit -l 20 dd if = / dev / zero of = / dev / null
[2]完成cpulimit -l 20 dd if = / dev / zero of = / dev / null
[3] - 完成cpulimit -l 20 dd if = / dev / zero of = / dev / null
[4] + Done cpulimit -l 20 dd if = / dev / zero of = / dev / null
root @ server1:〜#
现在检查cpulimit实用程序的CPU使用情况。

top
top - 11:59:10 up 16分钟,2位用户,平均负载:0.47,0.71,0.81
任务:共256个,2个运行,251个睡眠,3个停止,0个僵尸
%Cpu0:2.0 us,2.0 sy,0.0 ni,96.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st
%Cpu1:26.2 us,22.8 sy,0.0 ni,50.7 id,0.0 wa,0.3 hi,0.0 si,0.0 st
%Cpu2:14.0 us,12.3 sy,0.0 ni,73.8 id,0.0 wa,0.0 hi,0.0 si,0.0 st
%Cpu3:13.3 us,11.6 sy,0.0 ni,75.1 id,0.0 wa,0.0 hi,0.0 si,0.0 st
KiB Mem:1010540 total,204064 used,806476 free,20408 buffers
KiB Swap:1048572总数,0使用,1048572免费。 98340缓存Mem

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME + COMMAND
1433根20 0 7224 612 520 T 28.2 0.1 0:12.00 dd
1439根20 0 7224 616 520 R 26.6 0.1 0:12.13 dd
1434根20 0 7224 612 520 T 25.3 0.1 0:11.97 dd
1437根20 0 7224 612 516 T 22.9 0.1 0:11.93 dd
7根20 0 0 0 0 S 0.3 0.0 0:00.22 rcu_sched
8根20 0 0 0 0 S 0.3 0.0 0:00.21 rcuos / 0
如上所述,几乎对于多个核心CPU,CPU使用率从100%限制到20%。

恭喜!我们已经成功测试了cpulimit,以限制Ubuntu 14.04中的CPU使用情况:)

4链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏