如何限制某个进程的 CPU 和 RAM 使用率?

如何限制某个进程的 CPU 和 RAM 使用率?

我在一台装有 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 使用率。SIGCONTcpulimitnice

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、内存、带宽、或这些资源的组合可由指定给某个组的进程使用。

niceCgroups 相对于或的一个主要优势cpulimit是,限制适用于一组进程,而不只是一个进程。nicecpulimit也仅限于限制进程的 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:

  1. 找到进程的 PID:pidof foo。(例如,输出 1881)
  2. 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 文档

相关内容