问题出现得很突然,日志倒是留得挺全。数据库启动时报无法分配大页内存,检查发现系统预留的大页数量是零,而透明大页却是开启状态,两边配置互相打架。
这类报错背后常见的原因有几处,逐个排除就行。没有预留大页,内核分配自然失败。也可能是透明大页与数据库自己的内存管理策略冲突。
不容易想到的是,大页数量按峰值连接数算明显不够。
第一件事是查看大页配置与使用情况
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
改之前先确认了最近有没有人动过配置,避免白查一遍。
怎么算真的好了,看的是同一批现象。大页总数与空闲数满足数据库要求,启动不再报分配失败,内存抖动明显减少。
提醒一点。大页是预留内存,配多了别的进程就用不了;改完要重启数据库才能重新分配。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。