乐趣区

关于oom:技术分享-我的内存去哪儿生产实践

作者:秦福朗
爱可生 DBA 团队成员,负责我的项目日常问题解决及公司平台问题排查。酷爱 IT,喜爱在互联网里畅游,善于摄影、厨艺,不会厨艺的 DBA 不是好司机,didi~
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


一、问题背景

业务反馈,数据库最近总是隔一段时间连贯失败,过一会又没事了,一天能产生了 2、3 次,起初发现和主机传统大页的配置无关,具体起因是什么,请持续看。

二、环境背景:

MySQL 5.6.25 

vmware 虚拟机 CentOS 7.1

CPU 32C

内存 64G

innodb_buffer_pool_size = 48G

三、排查过程

1、首先查看了 mysql uptime 发现工夫在明天,阐明有过重启。

2、查看以后内存 cpu 的应用:

应用 free 查看零碎 64G 内存,used 应用了 61G+,还剩下 200 多 M 的 free,buffer/cache 也不多,应用 top 查看 MySQL RES 占用 20 多 G 左右。

应用 numa 查看以后 numa 调配:

发现每个 node 的残余内存均不多。

3、因为狐疑重启,所以查看下系统日志,发现了重启起因

发现 mysqld 发现了 OOM(什么是 OOM,能够在本公众号搜寻 OOM),且一天产生了 2、3 次和业务反馈是对的上的。

持续看,

此处可看到在产生 OOM 时,MySQL 占用零碎内存 aron-rss 大概为 22G。

计算 rss 的数量(此处为页数),每页为 4K,计算实现近大概为 22.1G。

那么问题来了,

主机内存 64G,理论才应用了 22G 多,怎么会发现生 OOM,free used 应用了 61G,那么 我的内存去哪了

4、查看 /proc/meminfo

看下面发现和咱们用 free 和 top 看到的值是一样的

持续看,

在传统大页这里发现了问题,

在这里,传统大页 Total 配置了 20000,FREE 也为 20000,阐明配置了大页但没在应用,hugepagesize 为 2M,这一块预留的就是 40G 大页内存。

Tips:“大内存页”也称传统大页、大页内存等有助于 Linux 进行虚拟内存的治理,规范的内存页为 4KB,这里应用“大内存页”最大能够定义 1GB 的页面大小,在系统启动期间能够应用“大内存页”为应用程序预留一部分内存,这部分内存被占用且永远不会被替换出内存,它会始终保留在那里,直到扭转配置。(具体介绍请看上面链接官网解释)

5、那么这 40G 大页内存是调配给谁的呢?

查问一下:

shell> /proc/sys/vm/hugetlb_shm_group
27
  
shell> id 27
uid=27(mysql) gid=27(mysql) groups=27(mysql)

hugetlb_shm_group 文件里填的是指定大页内存应用的用户组 id,这里查看到是 MySQL 组 id,那既然是给 MySQL 的为什么 free 等于 total,并且 mysql 还只有 20 多 G 理论应用内存呢?

原来在 MySQL 中还有专门启用大内存页的参数,在 MySQL 大内存页称为 large page。

6、查看 MySQL 配置文件

发现配置文件中的确有 large-page 配置,但出于禁用状态。

后与业务确认,很早之前的确启用过 mysql 的 large page,不过前面禁用了。排查到这根本就有了论断。

四、论断

这套环境之前开启了 20000 的大内存页,每页大小为 2MB,占用了 40G 内存空间,给 MySQL 应用,并且 MySQL 开启了 large page,但起初不应用的时候,只敞开了 MySQL 端的 large page 参数,但没有理论更改主机的对于大内存页的配置,所以导致,实际上主机上的还存在 20000 的大内存页,并且没在应用,这一部分长期闲暇,并且其余程序不能应用。

所以 MySQL 在应用 20G 内存左右,整个主机内存就饱和了,而后在局部条件下,就触发了 OOM,导致 mysqld 被 kill,但主机上又有 mysqld_safe 守护程序,所以又再次给拉起来,就看到了文章初的偶然连贯不上的景象。

五、后续操作

通过在本地测试,的确指定大页之后会导致内存占用,如果 MySQL 不配置,会闲暇这部分内存,且模仿大业务的状况下会产生 OOM。

所以,在问题环境上:

通过移除 vm 相干参数,使被占用的大内存页释放出来,MySQL 就没再被 oom 过。

六、倡议

1、MySQL 主机个别不用应用 hugepage,MySQL 本人解决 buffer pool 的分页治理,不须要操作系统的参加;

2、倡议在环境上线前,检查一下主机内存的大内存页调配,看是否有没在应用的传统大页的存在,防止影响后续业务的应用。

附:参考资料
1、https://docs.oracle.com/datab…
2、https://kerneltalks.com/servi…
3、https://dev.mysql.com/doc/ref…

退出移动版