对于运行 MongoDB、Redis、Oracle 等主流数据库的 Linux 服务器,最稳妥的处理方式是直接禁用透明大页(THP),这能有效规避因内存分配延迟引发的性能抖动。
先说结论:生产环境数据库建议禁用 THP,除非你有明确的测试数据证明开启有益。
- 先定位:检查当前 THP 状态是否为 always 或 madvise
- 先做:临时执行命令禁用,观察业务波动(需 root 权限)
- 再验证:固化配置到启动项,重启后确认状态
命令速用版
如果你需要立即生效且不怕重启丢失,可以直接执行以下命令(需 root 权限或使用 sudo):
sudo echo never > /sys/kernel/mm/transparent_hugepage/enabled
sudo echo never > /sys/kernel/mm/transparent_hugepage/defrag注意:部分旧内核路径可能是 /sys/kernel/mm/redhat_transparent_hugepage/,请先确认目录存在。
为什么会这样
透明大页的设计初衷是减少 TLB Miss,提升内存访问效率。但在数据库场景下,频繁申请和释放大内存块时,内核需要花费时间去分配或合并 contiguous 的物理页框。这个分配过程会导致线程停顿,表现为业务层面的延迟抖动。多家数据库厂商明确指出这是潜在风险点,建议在生产环境关闭。
分步处理
1. 检查当前状态
cat /sys/kernel/mm/transparent_hugepage/enabled如果输出中 [always] 或 [madvise] 被方括号包围,说明该模式当前生效。目标是将 [never] 变为生效状态。
2. 临时禁用(无需重启)
执行“命令速用版”中的 echo 命令。这会影响当前运行状态,重启后失效。
3. 永久禁用(推荐)
方法一:修改 GRUB 配置
编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 中添加 transparent_hugepage=never。保存后,根据发行版执行更新命令:
- CentOS/RHEL:
grub2-mkconfig -o /boot/grub2/grub.cfg - Ubuntu/Debian:
update-grub
执行完成后重启系统。
方法二:使用 systemd 服务(更灵活)
创建 unit 文件在启动早期执行 echo 命令,避免被其他初始化脚本覆盖。创建文件 /etc/systemd/system/disable-thp.service,内容如下:
[Unit]
Description=Disable Transparent Huge Pages
DefaultDependencies=no
After=local-fs-pre.target
Before=local-fs.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
[Install]
WantedBy=multi-user.target启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable disable-thp.service
sudo systemctl start disable-thp.service怎么验证是否生效
重启系统后,再次执行 cat /sys/kernel/mm/transparent_hugepage/enabled,确认 [never] 被方括号包围。同时观察数据库慢查询日志或监控面板,确认内存相关的延迟尖峰是否消失。
常见坑
- systemd-thp 服务干扰:部分发行版(如 RHEL/CentOS 7+)自带
systemd-thp服务,可能会在启动后期重置该配置。如果使用上述自定义 systemd 服务方法,请确保其优先级或禁用原有干扰服务。 - 云厂商初始化:某些云服务器镜像的 cloud-init 脚本可能会强制开启 THP,需检查用户数据脚本。
- 非数据库业务影响:禁用 THP 可能会略微增加某些高性能计算场景的 TLB Miss,但对于 IO 密集或延迟敏感的数据库业务,收益通常大于损失。
参考来源
- MongoDB Manual - Production Notes - Transparent Huge Pages (THP) - https://www.mongodb.com/docs/manual/administration/production-notes/
- Red Hat Knowledgebase - Impact of Transparent Huge Pages on database performance
- Oracle Database Documentation - Linux Huge Pages