我检测到我的服务进程在Linux服务器上泄漏内存,需要1.2G的物理内存并且消耗的内存越来越多。
当我查看内存泄漏的代码时,我注意到该进程已重新启动(此过程由supervisord管理,因此如果被杀死则重新启动)。进程日志中没有错误日志或紧急情况。所以我的猜测是它被内核杀死了。
内核什么时候会杀死泄漏内存的进程?什么时候消耗太多内存?或者它分配内存太快了?
答案 0 :(得分:1)
内存泄漏可能导致系统内存不足。如果内存变得非常低,将调用OOM(Out Of Memory)杀手来尝试从低内存状态恢复。 OOM Killer将终止一个或多个消耗更多内存且重要性最低(低优先级)的进程。通常,如果没有可用的用户地址空间或者没有可用的页面,则将调用OOM杀手。
OOM杀手使用select_bad_process(),badness()来确定并终止进程。这些函数通过基于各种因素为所有进程分配点/分数来确定进程,例如进程的VM大小,子进程的VM大小,正常运行时间,优先级,是否进行任何硬件访问,是交换器还是init或内核线。具有最高得分/得分(不良)的过程被终止/杀死。
另外,检查内核的过度使用行为(/ proc / sys / vm / overcommit_memory,/ proc / sys / vm / overcommit_ratio)以及进程的地址空间限制是否合适。
在识别内存泄漏的情况下,Valgrind是一个非常方便的工具。