我遇到了一个问题,一个进程由于错误而产生了非常多的线程,占用了内存,导致交换分区大量交换。因此,我关闭了交换(无论如何,在服务器集群中建议这样做),让有缺陷的程序尽早失败。令我惊讶的是,这根本没有改善情况!同样,设置vm.swappiness
为 0 也没有帮助。 iotop
显示大量阅读来自磁盘(几乎没有写入)。
我怀疑 Linux 内核仍在内存中交换代码页,并在需要时从磁盘重新读取被覆盖的代码页。当 RAM 非常低时,这种情况会非常频繁地发生,从而导致系统抖动,使计算机几乎无响应。
如何才能防止这种不幸且可能危险的情况发生?我尝试关闭 swap、cgroups 以限制该进程的内存和 CPU,以及 ulimit 以限制最多 30 个进程。但情况并没有得到改善。(好吧,这并不完全正确:限制 RAM 确实有所帮助,因为 RAM 会永久占用数百 MB 内存。)
特别是:我可以防止在内存中交换代码段,并让请求 RAM 的进程在下一次 malloc 时简单地获取 NULL 吗?
答案1
如何调整内存过量使用核算并将其设置为选项 2(不过量使用)而不是默认选项 0(启发式过量使用)?对此的描述如下
Don't overcommit. The total address space commit
for the system is not permitted to exceed swap + a
configurable amount (default is 50%) of physical RAM.
Depending on the amount you use, in most situations
this means a process will not be killed while accessing
pages but will receive errors on memory allocation as
appropriate.
以上片段来自内核文档
该策略可以设置vm.overcommit
可调。