首页 > 系统相关 >内存不足时Linux 内核自动触发OOM-killer

内存不足时Linux 内核自动触发OOM-killer

时间:2023-02-28 14:58:45浏览次数:47  
标签:overcommit OOM killer 内存不足 bad 内存 memory 进程

问题产生:

作者最近在搭建Hadoop+Hive集群时,将NameNode、DataNode、Rm全部部署到一台物理机上,查询量较大时连接挂掉。

问题定位:

使用JPS命令查看Metastore服务正常运行,hive2--Runjar挂掉。重启之后,过段时间又会挂掉。

Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢?linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程。

查看系统日志:

grep "Out of memory" /var/log/messages

问题分析:

hive2服务需要total-vm(进程使用的虚拟内存),anon-rss匿名内存(RAM实际分配的大小),file-rss映射到文件和设备的大小。

hive2服务生成mr程序,进行查询数据时,瞬间会占用大量内存。物理机的内存耗尽出发了系统的oom  killer导致。

问题解决:

参数/proc/sys/vm/overcommit_memory可以控制进程对内存过量使用的应对策略

overcommit_memory=0 允许进程轻微过量使用内存,但对于大量过载请求则不允许(默认)

overcommit_memory=1 永远允许进程overcommit

overcommit_memory=2 永远禁止overcommit

增大机器内存

服务部署分散到不同的机器上。

标签:overcommit,OOM,killer,内存不足,bad,内存,memory,进程
From: https://www.cnblogs.com/yaoshuigebiss/p/17164143.html

相关文章