我使用的Linux系统有很多用户,但有时会出现滥用情况;用户可能运行一个占用超过 80% CPU/内存的进程。
那么有没有办法通过限制进程可以使用的 CPU 使用量(例如 10%)来防止这种情况发生?我知道cpulimit
,但不幸的是,它对我指示它限制的进程(例如单个进程)应用了限制。所以我的问题是,如何将限制应用于所有正在运行的进程和将来将运行的进程,而无需提供它们的 id/路径?
答案1
尼斯/雷尼斯
nice
是对系统进行“一次性”调整的绝佳工具。
nice COMMAND
CPU限制
cpulimit
如果您需要运行 CPU 密集型作业,并且空闲 CPU 时间对于系统的响应能力至关重要。
cpulimit -l 50 -- COMMAND
cgroups
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
http://manpages.ubuntu.com/manpages/xenial/man1/cpulimit.1.html
答案2
虽然它可能会滥用内存,但不会滥用 CPU:当 CPU 空闲时,正在运行的进程(通过“运行”,我的意思是该进程不等待 I/O 或其他东西)将占用内存。默认情况下为 100% CPU 时间。并且没有理由强制执行限制。
现在,您可以通过 来设置优先级nice
。如果您希望它们应用于给定用户的所有进程,您只需确保用户的登录 shell 运行nice
:子进程将继承该nice
值。这取决于用户登录的方式。请参阅优先考虑 ssh 登录(很好)例如。
或者,您可以设置虚拟机。事实上,设置每个进程的限制没有多大意义,因为用户可以启动许多进程,从而滥用系统。对于虚拟机,所有限制对于虚拟机来说都是全局的。
另一个解决方案是设定/etc/security/limits.conf
限制;请参阅 limit.conf(5) 手册页。例如,您可以设置每次登录的最大 CPU 时间和/或每次登录的最大进程数。您还可maxlogins
以为每个用户设置为 1。
答案3
你看过cgroup吗?有一些关于拱门维基关于他们。阅读有关 的部分cpu.shares
,看起来它正在做您需要的事情,并且它们可以在用户级别上操作,因此您可以立即限制所有用户进程。
答案4
既然你的标签有centos
,你就可以使用systemd
。
例如,如果您想限制 ID 为的用户1234
:
sudo systemctl edit --force user-1234.slice
然后输入并保存:
[Slice] CPUQuota=10%
该用户下次登录时将会产生影响。
手册页:systemctl
、systemd.slice
、systemd.resource-control
...