cpulimit惹恼了我,所以我改进了它
#c #signals #patching

Previously | more previously

几天前,我发现了koude0。这是一个很好的工具,可以很好地补充nice。如果通常使用nice来减少通过更改其优先级来减少过程使用的CPU量,那么niced进程仍然可以使用比您想要的更多的CPU,并且如果没有更高优先级的任何内容,那么当然会使用所有需要的CPU 。

,但有时您想将过程限制在不超过某些特定比例的CPU时间的过程中,无论优先级如何。一个很好的例子是,当您不希望那些嘈杂的PC粉丝启动而您不在乎工作需要多长时间,因为无论是在15分钟内完成还是8个小时,它仍会在入睡时完成。<<<<<<<<<<<<<< /p>

cpulimit非常适合使用,并且易于使用。这样的调用:

cpulimit -l 50 somecommand ...

将运行somecommand,但仅限于使用CPU的50%。它是通过分叉定期检查以查看somecommand在做多少工作的观察员过程来做到这一点的,如果使用过多的工作,则通过发送STOP信号来暂停它。一段时间后,它将用CONT信号解开。当然,由于来自其他过程的计算机上的负载永远不会完全恒定,因此cpulimit很少击中目标,但是它足够接近。

,但我想对其进行一些调整。我希望能够交互“转动音量旋钮”,以便每当我幻想时,我都可以给somecommand或多或少地给CPU。结果是a pull request,不幸的是,它不太可能被合并,因为原始作者多年来都没有触及该项目,但是如果您想要任何一个漂亮的新功能应用补丁并构建自己的自定义cpulimit非常容易。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /p>

补丁的工作方式很简单。它为SIGUSR1SIGUSR2安装了信号处理程序,分别将CPU分配增加和减少1%。想将其调高50%吗?只需写一个小外壳循环即可发送信号50次:

for i in $(seq 1 50); do kill -SIGUSR1 $pid; done

确定将信号发送到哪个过程有点棘手,因为在运行两个 cpulimit进程。有第一个,只是在后台等待somecommand完成,然后有看门狗被分叉了。这是您要将信号发送到的看门狗。您可以判断哪个是看门狗,因为它通常具有更高的PID并使用一点CPU。如果您是cpulimit多个进程,则可以判断哪个看门狗与哪个过程有关,因为看门狗将在其命令行上具有命令及其参数。例如:

$ ps aux|grep ffmpeg|grep -v grep
david   90311 103.3  0.7 36105472 485448 s011  T     6:42pm   1:07.89 ffmpeg ...
david   90312   5.6  0.0 34221044    828 s011  S     6:42pm   0:02.82 cpulimit -l 100 ffmpeg ...
david   90310   0.0  0.0 34122740    796 s011  S     6:42pm   0:00.01 cpulimit -l 100 ffmpeg ...

您可以在这里看到我要求cpulimit允许ffmpeg仅使用该计算机上可用的几种CPU(即使用CPU的100% - 在现代机器上,最大允许的最大值是CPU核心 * 100 %)。因此,我的外壳启动了Process 90310,该过程用PID 90311分叉并执行了ffmpeg,并以PID 90312分叉了看门狗进程。看门狗使用了一点CPU。因此,我应该发送信号的90312处理。

$ for i in $(seq 1 400); do kill -SIGUSR1 90312; done

将发送“稍微调整一点”信号400次,因此ffmpeg现在最多仅限于CPU的500%,片刻之后:

$ ps aux|grep ffmpeg|grep -v grep
david   90311 497.0  0.8 36105472 507160 s011  T     6:42pm  12:42.37 ffmpeg ...
...

我们可以看到ffmpeg的运行要困难得多,现在仅占CPU的500%。