我正在使用 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