本文所列内容在Linode和Vultr的VPS上面均测试通过。

1,简介

平时如果有进程持续大幅度占用CPU时间的话,会影响其他程序的运行效率及系统稳定性,所以应当有所限制。类似的情况像自动维护脚本以及某些进程异常等等。

2,安装

安装CPULimit是很简单的,命令:

apt-get update
apt-get install cpulimit

3,限制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

可以看到,这个进程已经占满了100%的使用率,现在我们使用fg来将它换回前端,并且用Ctrl+c来结束:

root@server1:~# fg
dd if=/dev/zero of=/dev/null
^C222182151+0 records in
222182150+0 records out
113757260800 bytes (114 GB) copied, 259.084 s, 439 MB/s
root@server1:~#

现在我们来限制一下试试看:

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:~# Process 1853 detected

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

然后我们再用top看一下cpu使用情况:

top

回显:

top - 11:30:54 up 55 min,  1 user,  load average: 0.20, 0.58, 1.34
Tasks: 250 total,   2 running, 247 sleeping,   1 stopped,   0 zombie
%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 total,        0 used,  1048572 free.   158212 cached Mem

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

ok,我们看到了,33.8%的使用率,很接近我们设定的30%了。

 

下面再来个例子,讲解一下多核系统上怎么限制。

先用nproc看一下核心数:

nproc

本文测试的机器是4核的,和前面例子一样,我们先试一下不限制的时候:

for j in `seq 1 4`; do dd if=/dev/zero of=/dev/null & done

回显:

root@server1:~# for j in `seq 1 4`; do dd if=/dev/zero of=/dev/null & done
[1] 1263
[2] 1264
[3] 1265
[4] 1266
root@server1:~#

然后来top看一下:

top

回显:

top - 11:47:45 up 4 min,  1 user,  load average: 3.63, 1.53, 0.57
Tasks: 290 total,   5 running, 285 sleeping,   0 stopped,   0 zombie
%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 total,        0 used,  1048572 free.    93632 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                    
 1263 root      20   0    7224    612    520 R 100.0  0.1   2:21.40 dd                         
 1264 root      20   0    7224    616    520 R 100.0  0.1   2:21.41 dd                         
 1265 root      20   0    7224    612    520 R  99.0  0.1   2:21.03 dd                         
 1266 root      20   0    7224    616    520 R  98.0  0.1   2:20.82 dd                         
 1281 root      20   0  104416   3992   2920 S   1.0  0.4   0:00.03 sshd                       
 1283 root      20   0  104416   3988   2920 S   1.0  0.4   0:00.03 sshd                       
 1279 root      20   0  104556   4008   2924 S   0.7  0.4   0:00.08 sshd

可以看到,4个核心全都被占满了,先把这几个进程干掉:

killall dd

回显:

root@server1:~# killall dd
[1]   Terminated              dd if=/dev/zero of=/dev/null
[3]-  Terminated              dd if=/dev/zero of=/dev/null
[2]-  Terminated              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 in `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:~# Process 1434 detected
Process 1433 detected
Process 1437 detected
Process 1439 detected

[1]   Done                    cpulimit -l 20 dd if=/dev/zero of=/dev/null
[2]   Done                    cpulimit -l 20 dd if=/dev/zero of=/dev/null
[3]-  Done                    cpulimit -l 20 dd if=/dev/zero of=/dev/null
[4]+  Done                    cpulimit -l 20 dd if=/dev/zero of=/dev/null
root@server1:~#

然后我们来看一下top的情况:

top

回显:

top - 11:59:10 up 16 min,  2 users,  load average: 0.47, 0.71, 0.81
Tasks: 256 total,   2 running, 251 sleeping,   3 stopped,   0 zombie
%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 total,        0 used,  1048572 free.    98340 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                    
 1433 root      20   0    7224    612    520 T  28.2  0.1   0:12.00 dd                         
 1439 root      20   0    7224    616    520 R  26.6  0.1   0:12.13 dd                         
 1434 root      20   0    7224    612    520 T  25.3  0.1   0:11.97 dd                         
 1437 root      20   0    7224    612    516 T  22.9  0.1   0:11.93 dd                         
    7 root      20   0       0      0      0 S   0.3  0.0   0:00.22 rcu_sched                  
    8 root      20   0       0      0      0 S   0.3  0.0   0:00.21 rcuos/0

现在看到了吧,全都被限制下来了,呵呵。

作者 听涛

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注