首页/数据/数据库速查/THP 与 swap 的关闭要求
Redis 运维与场景124 条

THP 与 swap 的关闭要求

Redis 要求关闭透明大页(THP)与避免 swap:THP 让 fork/COW 放大数倍,swap 让内存换页导致延迟暴涨。

数据库速查数据更新于 2026-10-13

为什么必须关闭

透明大页(THP)让内核以 2MB 大页为单位管理内存,而 Redis 做快照、AOF 重写时依赖 fork 加写时复制。页粒度越大,COW 需要复制的内存越多,fork 耗时和内存峰值随之放大。swap 则是把内存页换到磁盘:一次换页的延迟是毫秒到秒级,对延迟敏感的 Redis 来说等同于故障。官方生产建议是把两者都处理掉。

基本信息

THP 目标never(/sys/kernel/mm/transparent_hugepage/enabled)
swap 目标关闭(swapoff -a)或把 vm.swappiness 降到 1
影响面fork 耗时、快照窗口、命令尾延迟
适用平台Linux 宿主机与容器宿主,云主机镜像常默认开启

典型使用场景

  • 新上线数十 GB 级实例前做系统基线检查,逐项确认 THP 与 swap
  • fork 耗时告警(latest_fork_usec 偏高)时,先排除系统层而非急着调参数
  • 出现无规律的毫秒级延迟毛刺,需要确认是否发生内存换页
  • 容器化部署时核对宿主机状态,容器内视图往往不是真实来源
  • 云主机规格变更或镜像升级后复检,防止参数被默认值覆盖

检查与关闭命令

检查与关闭命令
# 立即关闭 THP(重启后失效)
cat /sys/kernel/mm/transparent_hugepage/enabled    # 方括号落在 never 才算关掉
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 永久生效:GRUB 加 transparent_hugepage=never,或用 systemd 服务开机执行
# 关闭 swap
swapon --show
swapoff -a
# 若业务不允许彻底关闭 swap,至少降低换页倾向
sysctl -w vm.swappiness=1

检查项与期望值

检查项命令期望值
THP 状态cat /sys/kernel/mm/transparent_hugepage/enabled方括号位于 never
swap 开关swapon --show 或 free -h无 swap 条目,或使用量为 0
fork 耗时INFO persistence 的 latest_fork_usec微秒级;明显偏高先查 THP 与内存余量
换页活动vmstat 1 的 si/so 两列长期为 0,非 0 表示正在换页
容器里的 /sys 常常是只读挂载或宿主视角,看不到也改不动:排查 fork 变慢要先登宿主机确认 THP,而不是在容器内反复验证。
靠 swap 撑住内存不足是假象:换页延迟不可预测,Redis 宁可扩容、分片或清理大 key,也不要用 swap 兜底。
改完系统参数要回看 Redis 自身的证据:INFO persistence 里 rdb_last_bgsave_status 为 ok、latest_fork_usec 回落到百微秒到毫秒级,才算真正收益;只改了内核开关但 fork 依旧慢,说明瓶颈在内存用量或磁盘写入,而不是大页。

易错点

  • THP 开着跑大内存实例:fork 期间 COW 复制量成倍放大,快照窗口拉长,主线程阻塞导致超时雪崩
  • 只在当前 shell 执行 echo never,没写进 GRUB 或 systemd:机器重启后 THP 恢复开启,问题周期性复发
  • 容器内查到 never 就以为万事大吉:宿主机可能仍开启,必须登宿主复核
  • 用加 swap 缓解内存压力:换来的是秒级延迟毛刺,且触发时机不可控

数据来源与参考

  • Redis 官方文档: 系统配置建议
  • Redis 官方文档: fork 与 THP

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌