首页/数据/Redis 进阶速查/透明大页(THP)与 fork 延迟
持久化56 条

透明大页(THP)与 fork 延迟

开启 THP 时 fork 的页表拷贝量成倍放大,延迟显著上升;Redis 官方建议关闭透明大页,降低快照与全量同步时的停顿。

Redis 进阶速查数据更新于 2026-10-13

大页与分支开销

透明大页会把内存按更大粒度组织,对普通应用往往省页表开销,但对依赖分支加写时复制的实例不友好:按 4KB 粒度改一页要复制整块大页,页表复制与内存拷贝量被成倍放大。表现就是快照、日志重写、全量同步期间出现明显延迟尖刺。

基本信息

适用平台Linux 主机,包含容器所在的宿主机
建议取值关闭透明大页
检测命令查看内核透明大页开关文件与当前策略
对应指标INFO stats 的最近一次分支耗时、INFO memory 的写时复制占用
启动提示开启时进程启动日志会给出相关告警

排查场景

  • 快照期间出现秒级延迟尖刺,且与快照时间对齐
  • 日志重写与全量同步叠加时延迟进一步恶化
  • 大内存实例分支耗时明显偏高
  • 云主机默认开启透明大页,需要按发行版方式固化关闭并复查

检测与关闭

检测与关闭
cat /sys/kernel/mm/transparent_hugepage/enabled        # 方括号在 always 上表示已开启
echo never > /sys/kernel/mm/transparent_hugepage/enabled # 临时关闭,重启失效
redis-cli INFO stats | grep latest_fork_usec            # 最近一次分支耗时(微秒)
redis-cli INFO memory | grep rdb_last_cow_size          # 上次快照期间的写时复制占用
redis-cli INFO persistence | grep rdb_last_bgsave_status # 快照是否成功
grep -i 'transparent huge' /var/log/redis/redis.log | tail -3   # 启动告警

观测指标

指标含义异常表现
最近一次分支耗时执行分支操作的耗时(微秒)达到毫秒级数千以上说明偏慢
快照写时复制占用上次快照期间因写时复制增加的内存过大说明分支后写入量大或页粒度粗
重写写时复制占用上次日志重写期间增加的写时复制内存重写期间更敏感,常与尖刺同时出现
透明大页策略取值always、madvise、never 三态非 never 建议评估关闭
尖刺与快照时间对齐定位因果关系时间对齐才能确认是分支与复制放大
关闭方式要固化:临时写内核开关重启即失效,应通过内核启动参数、服务脚本、开机脚本或发行版的调优配置持久化,并在重启后复查一次实际取值。
容器内通常改不了宿主机的这项设置,因为内核参数是共享的。需要在宿主机层面操作,容器里执行可能报权限错误或只改变命名空间里的视角。
别把它当成延迟问题的唯一解释:分支耗时同时取决于实例内存规模(页表规模)、宿主机内存压力与是否发生交换。关闭后延迟没有改善,要继续看内存水位与存储延迟。

易错点

  • 只临时关闭不固化:一次重启就回到开启状态,问题时好时坏,定位难度大幅上升
  • 关闭后不做量化对比:不比对分支耗时与尖刺持续时间,既无法证明收益也无法排除其他根因
  • 在容器里改完以为宿主机已生效:内核参数共享,实际仍是开启状态
  • 忽略实例内存规模:几十 GB 的实例即使关闭大页,分支仍可能有数百毫秒耗时,需要同时降低分支频率

数据来源与参考

  • Redis 官方文档:延迟与 THP 建议(redis.conf 注释)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌