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

Gio*_*nir 40 command-line cpu centos limit

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

那么有没有办法通过限制进程可以使用的 CPU 使用量(例如 10%)来防止这种情况发生?我知道cpulimit,但不幸的是,它对我指示它限制的进程(例如单个进程)应用了限制。所以我的问题是,如何将限制应用于所有正在运行的进程和将来将运行的进程,而无需提供它们的 id/path 例如?

小智 32

不错/蕾妮丝

nice 是对系统进行“一次性”调整的绝佳工具。

 nice COMMAND
Run Code Online (Sandbox Code Playgroud)

处理器限制

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

cpulimit -l 50 -- COMMAND
Run Code Online (Sandbox Code Playgroud)

群组

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
Run Code Online (Sandbox Code Playgroud)

资源

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

  • 对于那些希望对 CPU 使用率设置硬限制的人,即使没有其他进程正在运行,请查看 `cpu.cfs_quota_us` 参数(请参阅 [手册](https://access.redhat.com/documentation/en-US/ Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-cpu.html#sect-cfs)) (5认同)
  • 我的理解是,nice 仅设置与其他进程相比的相对 CPU。如果没有其他进程正在使用 CPU,那么您的进程将使用 100% CPU,而不是限制为 10%。 (2认同)

vin*_*c17 24

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

现在,您可以通过nice. 如果您希望它们应用于给定用户的所有进程,您只需要确保他的登录 shell 运行时使用nice:子进程将继承该nice值。这取决于用户如何登录。例如,请参阅优先 ssh 登录(不错)

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

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


Pau*_*ska 11

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


cel*_*chk 7

对于记忆,你正在寻找的是ulimit -v。请注意,它ulimit是由子进程继承的,因此如果您在登录时将其应用于用户的登录shell,则它适用于他的所有进程。

如果您的用户都使用bash登录 shell,则放入以下行/etc/profile应该会导致所有用户进程的硬限制为 1 GB(更准确地说,一百万千字节):

ulimit -vH 1000000
Run Code Online (Sandbox Code Playgroud)

该选项H确保它是一个硬限制,也就是说,用户之后无法将其重新设置。当然,用户仍然可以通过一次启动足够多的进程来填充内存。

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

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


小智 6

既然你的标签有centos,你就可以使用systemd

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

sudo systemctl edit --force user-1234.slice

然后输入并保存:

[Slice] CPUQuota=10%

该用户下次登录时将会产生影响。

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