通过名称永远限制进程的内存

通过名称永远限制进程的内存

我正在使用 webpack 进行开发。问题是,我当前的项目很大,需要大约 6GB 内存(根据 top 大约占 RAM 的 30%)。

是否可以运行永久限制其内存的命令?需要注意的是,它以 root 身份启动(我们使用的工具 - 我知道 - 这很奇怪)

问题是,当内存太少时,我的机器就会死机。我正在寻找任何避免冻结的方法。所以也许为系统本身保留 500mb。我愿意接受建议

答案1

当使用 建立硬和/或软限制时ulimit [-H|S],一旦设置对于给定的外壳非 root 用户无法修改硬限制。为此,非根进程所有者需要停止执行,设置新的限制并重新启动。

您需要在当前项目的执行 shell 中指定限制。如果您在调用 shell 中执行此操作,则限制集将应用于该 shell 中启动或生成的所有进程,合并的。因此,考虑到这一点,您可能有兴趣专门设置最大堆栈大小 ( ulimit -H -s <limit>) 和/或最大驻留集大小ulimit -H -m <limit>对于最大 RSS)。

RSS 是物理内存中进程占用的内存部分。

您可能有权也可能无法访问后者,具体取决于您的系统。 (我现在无法访问 Ubuntu 操作系统来检查......你可能不走运。)

需要注意的是,设置该限制后,您获得的行为对于复制执行并不完全确定。根据系统在任何给定时刻执行的操作,它可能决定在一次执行到下一次执行的不同时间交换内存块。换句话说,它可能在运行期间的不同时间达到不同的RSS 值,例如,当同时执行其他不相关的进程时。

除了ulimit手册页之外,还可以查看答案和评论这里

答案2

如果您的项目(或运行它的程序)是 systemd 服务、切片、挂载或套接字,您将需要在其 service/slice/mount/socket 文件中设置资源限制,而不是使用/etc/security/limits.conf或设置它ulimit

您可以在您的发行版中找到您的 systemd 单元文件,/usr/lib/systemd/system/或者/etc/systemd/system根据您的发行版找到您的 systemd 单元文件。

要快速进行编辑,您可以使用systemctl edit <unit name>“直接”编辑。使用上一个命令指定--full将允许您在编辑时查看完整的服务文件(本质上是编辑副本和替换)。

对于您的特定问题,建议设置:

MemoryHigh=<Bytes>

您可以将此指令视为指定程序的内存使用限制点。您可以添加 K、M、G 或 T 作为后缀来分别指定千字节、兆字节、千兆字节或太字节。

您还可以设置:

MemoryMax=<Bytes>

超过此指令值后,将在单元内调用内存不足杀手。有关这些指令的联机帮助页(systemd.资源控制)建议将此作为“最后一道防线”。您还可以像前面的指令一样指定 K、M、G、T。

在上述两个指令之前还有一个已弃用的设置,MemoryLimit如果您没有使用较新的 systemd 版本,该设置可能会很有用。

提到的两个指令对整个控制组应用限制,这将防止分叉进程能够逃脱限制;但是,您也可以使用LimitAS(限制地址空间)指令对单个进程设置限制。

MemoryHigh=使用和的示例服务文件MemoryMax=

[Unit]
Description=A foobar service that does foo and bar
After=network.target

[Service]
Type=simple
MemoryHigh=2500M
MemoryMax=3000M
ExecStart=/usr/bin/foobar-daemon start
ExecStop=/usr/bin/foobar-daemon stop

[Install]
WantedBy=multi-user.target

有关指令的完整说明或其他信息;

systemd.资源控制man systemd.resource-control系统执行程序或者man systemd.exec

相关内容