我将 cgroups 与内存控制器一起使用来为每个用户设置内存限制(使用memory.limit_in_bytes
设置)。
问题在于此设置还考虑了缓存使用情况。因此,如果限制为 1GB,而用户仅下载或复制 1GB 的文件,他们的进程就会被终止。更糟糕的是,缓存的页面保留在内存中,因此即使运行的进程为零,用户的“内存使用量”仍然接近 1GB。
自然,这是没有意义的。我只想限制每个用户的私有(非匿名)内存使用总量。我怎样才能做到这一点?
或者,让 OOM 杀手在终止进程之前尝试删除用户的缓存页面,这甚至不会释放缓存页面。
发布我认为可能是更好的答案。
Linux 已经有一个功能可以做到这一点:OOM 杀手。
OOM 杀手在系统内存不足时运行,并支持快速消耗大量 RAM 的进程。它也不太可能杀死长时间运行的/系统(超级用户)进程。
可以通过调整
/proc/<pid>/oom_score_adj
文件进一步调整 OOM 杀手。该设置由子进程继承,因此您只需在每个用户的根进程上设置即可。(参见Documentation/filesystems/proc.txt,第 3.1 节)