我正在使用带有内存控制器的 cgroups 为每个用户设置内存限制(使用设置memory.limit_in_bytes
)。
问题是,此设置还会考虑缓存使用情况。因此,如果限制为 1GB,而用户只是下载或复制 1GB 的文件,则其进程会被终止。更糟糕的是,缓存的页面仍保留在内存中,因此即使没有运行任何进程,用户的“内存使用量”仍接近 1GB。
当然,这毫无意义。我只想限制每个用户的总私有(非匿名)内存使用量。我该如何实现?
或者,让 OOM 终止程序在终止进程之前尝试删除用户的缓存页面,这甚至不会释放缓存页面。
答案1
发布我认为可能更好的答案。
我的要求是防止一个用户的失控进程导致整个系统崩溃。
Linux 已经有一个可以执行此操作的功能:OOM killer。
这OOM 杀手当系统内存不足时运行,并优先处理快速消耗大量 RAM 的进程。它也不太可能终止长时间运行/系统(超级用户)进程。
可以通过调整文件来进一步调整 OOM 终止程序/proc/<pid>/oom_score_adj
。此设置由子进程继承,因此您只需在每个用户的根进程上进行设置即可。(请参阅文档/文件系统/proc.txt,第 3.1 节)