限制进程不超过CPU使用率的10%


32

我运行的Linux系统有很多用户,但有时会发生滥用情况。用户可能会运行一个进程,而该进程会占用超过80%的CPU /内存。

因此,是否有一种方法可以通过限制进程可以使用的CPU使用量来防止这种情况发生(例如,降低到10%)?我知道cpulimit,但是很遗憾,它会将限制应用于我指示限制的进程(例如,单个进程)。所以我的问题是,如何将限制应用于所有正在运行的进程以及将来将要运行的进程,而无需提供其ID /路径(例如)?


您是否遇到性能问题?还是只是数字困扰您?
ctrl-alt-delor

@richard性能问题,所以这就是为什么我试图终止/限制/结束似乎正在使用大量CPU的进程,但是我已经通过编写bash脚本来做到这一点。如果有帮助的话,这也是一个虚拟机
Giovanni Mounir 2014年

2
注意在很短的时间内杀死可能是100%的进程,以及系统进程。考虑cpulimit与您的搜索脚本一起使用。制定政策并推荐使用cpulimit,然后搜索10%以上,然后限制为5%(因此鼓励用户使用cpulimit)。还要确保您可以检测到多个进程,单个用户的进程加起来超过10%。
ctrl-alt-delor 2014年

@richard感谢Richard提供的所有这些非常有用的评论!他们极大地帮助了我!您提出的使用建议cpulimit比终止进程要好得多,因为稍后用户可以重新启动它(如您的评论之一所指出)。谢谢!
Giovanni Mounir 2014年

Answers:


20

尽管这可能是对内存的滥用,但不是CPU:当CPU空闲时,正在运行的进程(通过“运行”,我的意思是该进程不在等待I / O或其他东西)默认情况下为100%CPU时间。而且没有理由强制执行限制。

现在,您可以通过设置优先级nice。如果希望它们适用于给定用户的所有进程,则只需确保其登录外壳程序使用来运行nice:子进程将继承该nice值。这取决于用户的登录方式。例如,请参阅优先ssh登录(很好)

或者,您可以设置虚拟机。实际上,设置每个进程的限制没有多大意义,因为用户可以启动许多进程,从而滥用系统。对于虚拟机,所有限制对虚拟机都是全局的。

另一个解决方案是设置/etc/security/limits.conf限制。请参见limits.conf(5)手册页。例如,您可以设置每次登录的最大CPU时间和/或每次登录的最大进程数。您还可maxlogins以为每个用户设置为1。


1
@GiovanniMounir我的意思是:每个用户一个虚拟机。
vinc17 2014年

1
我知道了,但是不幸的是,这将浪费资源并且对我的目的并没有真正的用处,因为用户可能需要使用一些通用的开发包,而我不会在每台新机器上都安装它。我认为最好采用这种方式,并由bash脚本自动进行监视。
Giovanni Mounir 2014年

1
@GiovanniMounir您可以在多个虚拟机之间共享一个分区。
vinc17 2014年

@GiovanniMounir您可以使用LXCDocker将虚拟化开销减少到几乎为零。同样,“喜欢”也不是很强的理由。例如,如果您要管理共享的PHP主机,我会选择您的解决方案,因为使用LXC或虚拟机将需要重写$ 15 / $ 5许可软件,这实在是过头了。
Pooyan Khosravi 2014年

我的理解是,与其他进程相比,nice仅设置相对CPU。如果没有其他进程在使用CPU,则您的进程将使用100%的CPU,而不限于10%。
johny为什么

25

好/ renice

nice 是“一次性”调整系统的好工具。

 nice COMMAND

cpulimit

cpulimit 如果您需要运行CPU密集型工作,并且拥有空闲的CPU时间对于系统的响应能力至关重要。

cpulimit -l 50 COMMAND

小组

cgroups 将限制应用于一组流程,而不只是一个流程

cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3

资源资源

http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups


5
对于即使在没有其他进程正在运行的情况下也要对CPU使用率设置硬性限制的用户,cpu.cfs_quota_us请查看参数(请参阅手册
Diego Diego

cgroups易于使用,这要归功于systemd指令...为此目的,创建系统或用户单元是最佳选择
Yves Martin

例如:sudo cgclassify -g cpu:cpulimited 2315444
Aquarius Power

1
我的理解是,与其他进程相比,nice仅设置相对CPU。如果没有其他进程在使用CPU,则您的进程将使用100%的CPU,而不限于10%。
johny为什么

10

你看过cgroups了吗?Arch Wiki上有一些有关它们的信息。阅读有关的部分cpu.shares,它看起来像在做您需要的工作,并且它们可以在用户级别上运行,因此您可以一次限制所有用户进程。


但是,CGroups是必经之路。我还运行(许多)共享计算机服务器,我们使用cgroups限制整个登录会话可以使用的最大内核数。这样,如果这个人不断地开始新的过程,那么每个人都会得到一小块。相同的内存使用。您可以使用户通过pam_cgroups和cgrulesengd服务自动进入cgroup。您可以在cgconfig文件中使用“模板”将每个用户放入自己的cgroup中。cgrulesengd的行为类似于您的脚本,只是要确保每个进程都在正确的cgroup中,而不是杀死进程。
jsbillings

即使您不使用cgroups来限制资源使用,也可以通过查看每个资源的“ stat”文件,然后将其用于5分钟的脚本,来使用它来评估个人正在使用的资源量。
jsbillings 2014年

3

对于内存,您正在寻找的是 ulimit -v。请注意,它ulimit是由子进程继承的,因此,如果在登录时将其应用于用户的登录外壳,它将应用于其所有进程。

如果您的用户全部都bash用作登录外壳,那么将以下行放入/etc/profile应该导致所有用户进程的硬限制为1 GB(更确切地说,为一百万字节):

ulimit -vH 1000000

选项 H可确保这是一个硬性限制,也就是说,用户以后无法对其进行备份。当然,用户仍然可以通过一次启动足够多的进程来填充内存。

对于其他shell,您必须找出它们读取的初始化文件(以及其他什么命令而不是其他命令)。 ulimit使用的)。

对于CPU,您想要的东西对我来说似乎没有意义。当仅运行一个进程时,让90%的CPU处于闲置状态有什么用?我认为您真正想要的是nice(可能是ionice)。请注意,像一样ulimitnice值是由子进程继承的,因此在登录时将其应用于登录shell就足够了。我想这也适用,ionice但我不确定。


感谢您的记忆建议!您是否有机会向我展示一个示例,以在登录时将其应用于用户的登录外壳?我不太确定该怎么做。我也很抱歉,因为不够清楚。我正在尝试做的是不允许任何进程使用超过10%的CPU。那么,您认为这样做nice足够好吗?如果是这样,您认为您可以举例说明实现这一目标吗?
Giovanni Mounir 2014年

当只有一个进程正在运行时,我仍然无法保持CPU 90%空闲。
celtschk 2014年

1
如果当前并发运行的进程少于10个(通过运行我的意思是真正在运行,而不仅仅是等待用户输入或磁盘I / O),那么实际上可以保证其中一个进程拥有10%以上的CPU。否则,CPU将实际上处于空闲状态。而且,如果您杀死了超过10%的任何进程,我相信您将有许多用户想要杀死您。或者至少,它将设法让您替换一个对这些数字意味着什么的线索的人,因为您似乎没有。
celtschk 2014年

与@celtschk的注释相反,如果有11个或更多正在运行的进程(受CPU约束),则它们的比例将小于9.09%。因此,如果我使用的系统禁止cpu使用率超过10%,那么我可以运行11个或更多进程,并且躲在雷达下。
ctrl-alt-delor

@richard您是对的,如果脚本将用户使用的内存/ CPU总量相加,然后在百分比达到特定数量时终止该用户的所有进程,则可能会更好(因此也会记录他的日志)出去)
Giovanni Mounir 2014年

3

由于您说的是cpulimit在您的情况下不切实际,因此我建议您看一下nicerenicetasket,尽管taskset允许设置进程的CPU关联性,但它们可能与您要实现的目标接近。可能不会立即对您的情况有所帮助。


1
nicerenice?真好!我看过他们的手册页,但是我仍然认为他们不能提供帮助,因为您仍然必须设置进程ID。但是,如果您能给我一个涉及这些软件包的示例,将限制应用于所有正在运行的进程/未来进程,那就太棒了!
Giovanni Mounir 2014年

1

由于您的标签具有centos,因此您可以使用systemd

例如,如果您想限制ID为的用户1234

sudo systemctl edit --force user-1234.slice

然后输入并保存:

[Slice] CPUQuota=10%

下次用户登录时,它将影响。

手册页:systemctlsystemd.slicesystemd.resource-control...


0

如果要限制已经启动的进程,则必须通过PID逐个完成,但是您可以使用批处理脚本来完成,如以下所示:

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

就我而言,pypdfocr发起了贪婪tesseract

同样在某些情况下,如果您的CPU相当不错,则可以使用renice如下所示的代码:

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.