我在一台装有 SFTP 和控制台的 Ubuntu VPS 上。我需要一个特定的进程来只使用 60% 的 CPU 和 2048 MB 的 RAM。
我还需要另一个进程仅使用 30% 的 CPU 和 1024MB 的 RAM。
如何限制进程的 CPU 和 RAM 使用率?
答案1
被警告:这里有龙。
当您开始沿着这种程度的具体控制应用程序/进程/线程资源的道路前进时,在调试速率限制未考虑到的问题时,您就开始打开一个真正的潘多拉魔盒。
也就是说,如果您相信自己知道自己在做什么,那么您有三个可用选项:nice
、、cpulimit
和控制组 (Cgroups)。
以下是这三种方法的 TL;DR:
好的⇢nice {process}
这是一种对任务进行优先级排序的非常简单的方法,对于“一次性”使用非常有效,例如,当机器未被其他任务(或人员)使用时,降低应该使用更多 CPU 的长时间运行、计算量大的任务的优先级。
CPU 限制⇢cpulimit -l 60 {process}
如果当 CPU 使用率超过一定量时,服务器性能会受到影响(即停滞),则cpulimit
可以帮助减轻系统压力。它通过以不同的时间间隔暂停进程来实现这一点,通过向进程发送SIGSTOP
和信号将其保持在定义的上限以下。不会改变进程的值,而是监视和控制实际的 CPU 使用率。SIGCONT
cpulimit
nice
cpulimit
当您想要确保某个进程不会使用超过一定比例的 CPU 时,您会发现这很有用,您的问题就提到了这一点,但缺点是当系统空闲时(nice
允许),该进程不能使用所有可用的 CPU 时间。
CGroups
sudo cgcreate -g cpu:/restrained
sudo cgset -r cpu.shares=768 restrained
sudo cgexec -g cpu: restrained {process}
Cgroups(控制组)是 Linux 内核内置的一项功能,可让您控制资源的分配方式。使用 Cgroups,您可以指定 CPU、内存、带宽、或这些资源的组合可由指定给某个组的进程使用。
nice
Cgroups 相对于或的一个主要优势cpulimit
是,限制适用于一组进程,而不只是一个进程。nice
和cpulimit
也仅限于限制进程的 CPU 使用率,而 Cgroups 可以限制其他进程资源。
如果您深入研究 Cgroups,那么您就可以针对特定的一组任务对系统进行超级优化。
答案2
注意:如果您不想给进程设置硬限制,而只想设置优先级,请查找命令
nice
。此答案将假设您想要硬限制。
限制 CPU 使用率
这个精彩的答案另一个问题很好地解释了这一点
安装CPU限制
sudo apt-get install cpulimit
它提供了不同的方法来限制进程的 CPU 使用率
foo
,例如 20%
按其进程名称:
sudo cpulimit -e foo -l 20
。通过其绝对路径名:
sudo cpulimit -P /usr/bin/foo -l 20
根据其PID:
- 找到进程的 PID:
pidof foo
。(例如,输出 1881)sudo cpulimit -p 1881 -l 20
限制内存使用
有关更多选项,请参阅这个帖子如何限制 RAM 的使用。
例如,要将进程 12345 的 RAM 使用量限制为 2048 MB,您可以使用prlimit
命令
$ prlimit --pid 12345 --as=2048000000
答案3
在花了几个小时寻找这个问题的答案之后,我找到了一个在 Ubuntu 上开箱即用的单行代码:
流程 #1:
systemd-run --scope -p CPUQuota=60% -p MemoryMax=2048M -p MemoryHigh=1940M --user [yourcommand1]
流程 #2:
systemd-run --scope -p CPUQuota=30% -p MemoryMax=1024M -p MemoryHigh=970M --user [yourcommand2]
此命令在底层使用 Cgroups 但为您抽象了其复杂性。
注意:MemoryMax
是硬性上限,因此我们还使用MemoryHigh
参数(这里任意设置为的 95% MemoryMax
)来更优雅地处理内存限制,如MemoryMax
以下链接的描述所述:
如果内存使用量无法控制在限制范围内,则单元内部将调用内存溢出终止程序。建议使用 MemoryHigh= 作为主要控制机制,并使用 MemoryMax= 作为最后一道防线。
更多信息可以参见systemd.resource-control 文档