当系统出现oom
问题时,我们一般的定位思路是怎样的?
系统OOM
常见的原因有:
1、用户态内存需求过多,资源不足;
2、大页配置不正确;
3、水位线值异常;
4、slab
内存过多;
5、rcu
异常;
OOM
问题定位步骤如下:
1、查看/proc/meminfo
,查看用户态内存和内核态内存分别占用多少内存;通过top
命令查看占用内存较多的前10
个进程;
1、用户态内存使用过多;
2、top 10
的进程存在非虚拟机进程,通常情况下,使用内存最多的是虚拟机进程。如果是费虚拟机进程出现在了前top10
里,那么有可能是这个进程有内存泄露的问题;
3、如果top10
进程都是虚拟机进程,确认虚拟机的规格是不是超过上限了;
2、查看大页配置是否正确,确认是否大量大页没有使用。如果大页还有剩余,虚拟机都是使用的小页,那么有可能是大页配置的不正确;
3、查看linux
系统水位线配置是否正常,水位线,一般配置在文件/proc/sys/vm/min_free_kbytes
,水位线控制有3
个值,min
,low
,high
,
当可用内存低于low
时,系统开始回收内存。
当可用内存大于high
时,停止回收,
当可用内存低于min
值时,禁止给用户态进程分配内存;
当水位线值被误修改为很大的值时,很容易造成用户态内存不足。
4、查看/proc/slabinfo
,内核及模块通过kmalloc
分配的内存是通过slab