数据库场景必须禁用THP:需同时设enabled和defrag为never,并通过内核参数transparent_hugepage=never永久关闭,再重启数据库进程验证;启用标准HugePages时更须彻底禁用THP以防内存冲突。

数据库在 Linux 上性能不稳、延迟抖动,透明大页(THP)往往是隐藏推手。对 Oracle、MySQL、PostgreSQL 等 OLTP 场景而言,不是开启 THP 能提升性能,而是必须禁用它——否则内核后台线程 khugepaged 会周期性扫描、合并、拆分内存页,引发毫秒级卡顿甚至节点异常重启。
确认 THP 当前是否真正关闭
只改 /sys/kernel/mm/transparent_hugepage/enabled 不够,defrag 同样关键。二者必须同时为 [never] 才算生效:
- 运行
cat /sys/kernel/mm/transparent_hugepage/enabled,输出应为always madvise [never] - 运行
cat /sys/kernel/mm/transparent_hugepage/defrag,输出应为always defer+madvise [never] - 若任一文件中括号内不是
never,说明 THP 仍在后台活动,数据库仍可能被干扰
临时禁用(验证与应急用)
适用于压测前快速止损或排查问题,立即生效但重启后失效:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
echo never > /sys/kernel/mm/transparent_hugepage/enabledecho never > /sys/kernel/mm/transparent_hugepage/defrag- 执行后务必再次
cat两个路径,确认方括号中均为never
永久禁用(生产环境唯一推荐方式)
写入启动参数最可靠,可彻底绕过 systemd、tuned、cloud-init 等服务的覆盖风险:
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX行末尾添加:transparent_hugepage=never - 执行
update-grub(Debian/Ubuntu)或grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS) - 重启系统
- 重启后仍需检查两个 sysfs 文件,确保均为
[never]
禁用 THP 后如何真正提升数据库性能
关掉 THP 是前提,不是终点。要获得 TLB 命中率提升和内存访问优化,应配合标准 HugePages:
- 预留静态大页:例如设
vm.nr_hugepages = 1024(对应约 2GB 的 2MB 大页) - 数据库进程绑定使用:MySQL 加
--huge-pages参数;Oracle 配置use_large_pages=only - 关键原则:只要启用了标准 HugePages,就必须彻底禁用 THP,否则两者争抢连续内存,导致大页分配失败或内存碎片


















