问题出现得很突然,日志倒是留得挺全。数据库启动时报无法分配大页内存,检查发现系统预留的大页数量是零,而透明大页却是开启状态,两边配置互相打架。

这类报错背后常见的原因有几处,逐个排除就行。没有预留大页,内核分配自然失败。也可能是透明大页与数据库自己的内存管理策略冲突。

不容易想到的是,大页数量按峰值连接数算明显不够。

第一件事是查看大页配置与使用情况

grep -i huge /proc/meminfo

再往下按需预留大页数量

sysctl -w vm.nr_hugepages=1024

随后关闭透明大页

echo never > /sys/kernel/mm/transparent_hugepage/enabled

末了写进配置并确认

grep -i huge /etc/sysctl.conf

改之前先确认了最近有没有人动过配置,避免白查一遍。

怎么算真的好了,看的是同一批现象。大页总数与空闲数满足数据库要求,启动不再报分配失败,内存抖动明显减少。

提醒一点。大页是预留内存,配多了别的进程就用不了;改完要重启数据库才能重新分配。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189