redis必须禁用thp,因其写时复制机制在2mb大页下会将内存复制量放大512倍,导致incr等写命令延迟飙升、慢查询增多;需同时设enabled和defrag为[never]并重启redis生效。

Redis 出现间歇性卡顿、慢查询增多、INFO commandstats 显示 incr 或 set 延迟异常升高,大概率是 THP 在后台偷偷合并内存页导致的。必须禁用,不是可选项。
如何确认 THP 正在干扰 Redis
直接查内核状态,别信日志里“WARNING”出现与否——有些发行版(如 RHEL/CentOS 6+)把路径改成了 /sys/kernel/mm/redhat_transparent_hugepage/enabled,而 Redis 源码只认 /sys/kernel/mm/transparent_hugepage/enabled,所以即使没报 WARNING,问题依然存在。
- 运行
cat /sys/kernel/mm/transparent_hugepage/enabled,输出含[always]或[madvise]就说明 THP 活跃;只有[never]才算关闭 - 同样检查
cat /sys/kernel/mm/transparent_hugepage/defrag,它也必须是[never];只关enabled不关defrag,内核线程khugepaged仍会触发碎片整理,照样卡 Redis - 某些云主机(AWS EC2、阿里云部分镜像)预装
tuned,它可能在启动后自动重开 THP,得额外执行systemctl stop tuned && systemctl disable tuned
临时禁用 THP(验证用,重启即失效)
适合快速验证是否为 THP 导致卡顿,无需重启系统或 Redis,但仅限测试阶段使用。
本文档主要讲述的是Android 操作系统的介绍;Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 必须用 root 执行:
echo never > /sys/kernel/mm/transparent_hugepage/enabled - 同时执行:
echo never > /sys/kernel/mm/transparent_hugepage/defrag - 验证:
cat /sys/kernel/mm/transparent_hugepage/enabled和cat /sys/kernel/mm/transparent_hugepage/defrag都应显示[never] - 之后需重启 Redis 进程才能生效(fork 重写时才真正避开 THP 影响)
- 普通用户执行会报
Permission denied;容器环境若挂载/sys为只读,该操作会失败
永久禁用 THP(生产环境必须走这步)
靠 /etc/rc.local 不可靠——systemd 系统常忽略它,且服务依赖顺序难控。推荐 systemd service 方式,兼容 CentOS 7+/RHEL 8+/Ubuntu 20.04+。
- 创建服务文件:
/etc/systemd/system/disable-thp.service,内容包含ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag" - 关键点:
DefaultDependencies=no和Before=sysinit.target确保它在几乎所有服务前运行 - 启用并启动:
systemctl daemon-reload && systemctl enable disable-thp.service && systemctl start disable-thp.service - 重启后务必再检查两个路径的输出,确认仍是
[never];部分 AMI 会在 grub 更新后仍加载旧内核,得确认uname -r和grub2-editenv list是否一致
为什么只禁用 THP 还不够
THP 是个引子,不是全部。Redis 卡顿常是组合拳:THP + 内存过提交 + fork 阻塞 + 日志刷盘策略不当。禁用 THP 后如果仍有延迟波动,立刻检查:
-
vm.overcommit_memory = 1必须设为 1,否则bgsavefork 失败概率大增;写入/etc/sysctl.conf并执行sysctl -p -
echo 1 > /proc/sys/vm/overcommit_memory是临时设置,别漏掉持久化 - Redis 日志中若还有
Can't save in background: fork: Cannot allocate memory,说明overcommit没生效或内存真不足 - 云主机上,
/proc/meminfo中的AnonHugePages值应为 0;不为 0 说明 THP 仍在暗中工作
THP 关闭本身很简单,难的是确保它在所有重启路径下都稳稳处于 [never] 状态——尤其当系统有 tuned、自定义 initramfs、或用了 containerd/kubelet 的节点时,defrag 文件可能被反复重置。每次上线新机器或升级内核后,都要重新验证两个 cat 命令的输出。










