查看/proc/meminfo
提示:
“大内存页”也称为传统大页、大页内存等,帮助Linux管理虚拟内存和默认的内存页是4KB这里“大内存页”可以用来定义最大页大小为1GB系统启动时“大内存页”可以用来保留部分内存这部分内存被占用后会被占用永远不会被使用。更换内存,它将保留在那里,直到配置更改。(具体请看下面链接官方解释)
那么这么大的一页内存又是谁分配的呢?
检查:
/proc/sys/vm/hugetlb_shm_group27
id27uid=27(mysql)gid=27(mysql)groups=27(mysql)
hugetlb_shm_group文件中填充的是指定大页内存使用的用户组ID,可以是这里看到的是MySQL组ID,那么既然是给MySQL用的,为什么free等于total,而mysql实际使用的内存只有20GB多呢?
原来MySQL中有一个参数是专门启用大内存页的,在MySQL中,大内存页称为大页。
查看MySQL配置文件
发现配置文件中其实有大页配置,但处于禁用状态。
与业务确认后,mysql的largepage其实很早就开启了,但是后来又关闭了。经过研究,我们基本上得出了一个结论。
结论
该环境之前启用了20000个大内存页,每个页大小为2MB,占用40G内存空间,被MySQL使用,并且MySQL启用了Largepage被开启off,不过后面不使用的时候,只是关闭了MySQL端的largepage参数,并没有真正改变主机的大内存页配置。因此,主机上实际上还有20000个大内存页,并且它们没有被使用时,这部分将长期处于不活动状态,无法被其他程序使用。
所以当MySQL使用20G左右内存时,整个主机内存饱和,并且在一定条件下触发OOM,导致mysqld被杀死,但是主机上有mysqld_safe守护进程,所以会出现这种情况再次拉起后,我看到文章开头的链接偶尔出现错误。
上一篇:linux查看内存使用率命令
下一篇:电脑查看内存命令