如何限制 Linux 中进程可以消耗的内存大小

如何限制 Linux 中进程可以消耗的内存大小

我正在尝试弄清楚如何将 mongo 守护进程的内存使用量限制为 4G。

我考虑将 limits.conf 与 memlock 一起使用,但我不确定这是否是正确的方法。

从 limits.conf 手册页中,我了解到 ulimits 是指用户而不是进程,并且“memlock”的定义对我来说也不清楚:

memlock
  maximum locked-in-memory address space (KB)

如何限制进程的内存使用量?

答案1

MongoDB 使用内存映射文件进行所有存储,似乎您可以限制这些文件的大小:

但是,如果您担心 top 中显示的大量内存数字,它们并不(完全)对应于 Mongo 的物理内存使用情况。部分内存将映射到磁盘,具体取决于您的 io 缓存设置,请参阅检查内存使用情况(MongoDB)

答案2

memlock 限制用户使用无法交换的页面,例如大页面。这不是您想要的。

您不想使用,ulimit -v因为使用 MongoDB 时,您的 VSS 将包含整个数据集。您可以尝试ulimit -m限制 RSS,但这在 Linux 2.6 及更高版本上不起作用。即使可以,达到限制也会导致奇怪的行为,因为程序分配内存的尝试会失败。

更好的方法是使用cgroups. jlebar 有一个教程关于这一点。cgroups 与 ulimit 的两个关键点是

  1. 有用
  2. 当 RSS 使用量接近极限时,Linux 的正常内存回收算法就会启动。对于 MongoDB,我认为这会导致缓存数据被丢弃。

相关内容