如何限制一个进程可以在linux中使用的内存大小

我想弄清楚如何限制mongo守护进程的内存使用到4G。

我想使用limits.conf与memlock,但我不知道这是正确的方法来做到这一点。

从limits.conf手册页我已经了解,ulimits是指用户,而不是过程,而且“memlock”的定义是不清楚的:

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

我怎样才能限制进程的内存使用?

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

但是,如果您担心上面显示的大内存数量,它们与Mongo的物理内存使用量并不完全一致。 部分内存将被映射到磁盘,具体取决于您的iocaching设置,请参阅检查内存使用情况(MongoDB) 。

memlock限制用户使用不能被换出的页面,例如巨大的页面。 这不是你在找什么。

您不希望使用ulimit -v因为在MongoDB中,VSS将包含整个数据集。 你可以尝试ulimit -m来限制RSS,但是这对Linux 2.6和更新版本不起作用。 即使这样做,当程序尝试分配内存失败时,达到极限可能会导致奇怪的行为。

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

  1. 有用
  2. 当RSS使用量接近限制时,linux的正常内存回收algorithm踢了。对于MongoDB,我认为这将导致caching的数据被丢弃。