为什么必须关闭
透明大页(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 依旧慢,说明瓶颈在内存用量或磁盘写入,而不是大页。