本文所列内容在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
现在看到了吧,全都被限制下来了,呵呵。