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