我有一台 Linux 机器,运行大约 10 个内部编写的进程。
每隔一天(!),机器就会完全耗尽内存,进入交换区并失去响应。这种情况会在几秒钟内迅速发生,因此不可能一直看着机器死机。这是一次突然泄漏,而不是渐进式泄漏,因此 top(1) 不会给出任何即将发生不良事件的迹象。
识别哪些进程导致了问题的最佳方法是什么?
答案1
您可以研究禁用内存过量提交,这样内核就会终止泄漏的进程而不是机器。
您可以使用以下两个 sysctl 禁用过度提交:
vm.overcommit_ratio=60
vm.overcommit_memory=2
第一个数字取决于您有多少内存和多少交换空间。分配限制将是:
amount_of_swap + overcommit_ratio/100 * amount_of_ram
答案2
您可以使用以下命令为每个进程设置内存限制禁止使用 ulimit命令以防止它们占用所有系统内存。要获取通知,我建议使用监控监控每个进程的内存使用情况。