蚊章汇 - cpulimit
type: channel
link: https://linuxcn.bwsl.wang/tag/cpulimit/
items: 使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
type: item
date: 2015-01-26T15:42:00+08:00
description: Linux内核是一名了不起的马戏表演者，它在进程和系统资源间小心地玩着杂耍，并保持系统的正常运转。 同时，内核也很公正：它将资源公平地分配给各个进程。但是，如果你需要给一个重要进程提高优先级时，该怎么做呢？ 或者是，如何降低一个进程的优先级？ 又或者，如何限制一组进程所使用的资源呢？答案是需要由用户来为内核指定进程的优先级大部分进程启动时的优先级是相同的，因此Linux内核会公平地进行调度。 如果想让一个CPU密集型的进程运行在较低优先级，那么你就得事先配置好调度器。下面介绍3种控制进程运行时间的方法：使用 nice 命令手动降低任务的优先级。使用 cpulimit 命令不断的暂停进程，以控制进程所占用处理能力不超过特定限制。使用linux内建的control groups（控制组）功能，它提供了限制进程资源消耗的机制。我们来看一下这3个工具的工作原理和各自的优缺点。模拟高cpu占用率在分析这3种技术前，我们要先安装一个工具来模拟高CPU占用率的场景。我们会用到CentOS作为测试系统，并使用Mathomatic toolkit中的质数生成器来模拟CPU负载。很不幸，在CentOS上这个工具没有预编译好的版本，所以必须要从源码进行安装。先从 http://mathomatic.orgserve.de/mathomatic-16.0.5.tar.bz2 这个链接下载源码包并解压。然后进入 mathomatic-16.0.5/primes 文件夹，运行 make 和 sudo make install 进行编译和安装。这样，就把 matho-primes 程序安装到了 /usr/local/bin 目录中。接下来，通过命令行运行：/usr/local/bin/matho-primes 0 9999999999 > /dev/null & 程序运行后，将输出从0到9999999999之间的质数。因为我们并不需要这些输出结果，直接将输出重定向到/dev/null就好。现在，使用top命令就可以看到matho-primes进程榨干了你所有的cpu资源。好了，接下来（按q键）退出 top 并杀掉 matho-primes 进程（使用 fg 命令将进程切换到前台，再按 CTRL+C）nice命令下面介绍一下nice命令的使用方法，nice命令可以修改进程的优先级，这样就可以让进程运行得不那么频繁。 这个功能在运行cpu密集型的后台进程或批处理作业时尤为有用。 nice值的取值范围是[-20,19],-20表示最高优先级，而19表示最低优先级。 Linux进程的默认nice值为0。使用nice命令（不带任何参数时）可以将进程的nice值设置为10。这样调度器就会将此进程视为较低优先级的进程，从而减少cpu资源的分配。下面来看一个例子，我们同时运行两个 matho-primes 进程，一个使用nice命令来启动运行，而另一个正常启动运行：nice matho-primes 0 9999999999 > /dev/null & matho-primes 0 9999999999 > /dev/null & 再运行top命令。看到没，正常运行的进程（nice值为0）获得了更多的cpu运行时间，相反的，用nice命令运行的进程占用的cpu时间会较少（nice值为10）。在实际使用中，如果你要运行一个CPU密集型的程序，那么最好用nice命令来启动它，这样就可以保证其他进程获得更高的优先级。 也就是说，即使你的服务器或者台式机在重载的情况下，也可以快速响应。nice 还有一个关联命令叫做 renice，它可以在运行时调整进程的 nice 值。使用 renice 命令时，要先找出进程的 PID。下面是一个例子：renice +10 1234 其中，1234是进程的 PID。测试完 nice 和 renice 命令后，记得要将 matho-primes 进程全部杀掉。cpulimit命令接下来介绍 cpulimit 命令的用法。 cpulimit 命令的工作原理是为进程预设一个 cpu 占用率门限，并实时监控进程是否超出此门限，若超出则让该进程暂停运行一段时间。cpulimit 使用 SIGSTOP 和 SIGCONT 这两个信号来控制进程。它不会修改进程的 nice 值，而是通过监控进程的 cpu 占用率来做出动态调整。cpulimit 的优势是可以控制进程的cpu使用率的上限值。但与 nice 相比也有缺点，那就是即使 cpu 是空闲的，进程也不能完全使用整个 cpu 资源。在 CentOS 上，可以用下面的方法来安装它：wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive…