Redis为什么在Linux系统中会出现莫名其妙的卡顿_关闭操作系统THP透明大页特性

P粉602998670

P粉602998670

2026-05-19

958人浏览

原创

redis周期性卡顿主因是linux的thp特性,开启后fork()触发的写时复制需拷贝2mb大页而非4kb,导致incr/set等命令进慢日志;须永久关闭thp(如grub加transparent_hugepage=never),并验证anonhugepages为0、rdb_last_bgsave_time_sec≤0.1s。

redis为什么在linux系统中会出现莫名其妙的卡顿_关闭操作系统thp透明大页特性

Redis 在 Linux 上出现周期性、不可预测的卡顿,大概率不是 Redis 自身 bug 或配置错误,而是操作系统层的 transparent_hugepage(THP)在作祟——它会让 fork() 后的内存写时复制(Copy-on-Write)开销暴增,直接拖慢所有写命令,哪怕 INCRSET 这类简单操作也会进慢日志。

为什么 THP 会让 Redis 卡顿

Redis 的 RDB 持久化依赖 fork() 创建子进程。开启 THP 后,内核默认用 2MB 大页管理内存,而 Redis 主进程频繁分配/释放小对象(如字符串、dict entry),导致:
fork() 虽快,但后续每个写操作触发的 COW 实际要拷贝 2MB 页,而非传统 4KB;
khugepaged 后台线程持续扫描合并小页,与 Redis 内存操作争抢 mmap 锁,引发抖动;
– 即使启用了 madvise 模式(如 AWS Ubuntu 默认),Redis 的 malloc 行为仍会高频触发 THP 合并。

典型现象包括:
INFO persistencerdb_last_bgsave_time_sec 突然飙升到 2~5s(正常应 ≤0.1s);
SLOWLOG GET 10 里大量 INCRHSET 耗时超 10ms;
strace -p $(pgrep redis-server) -e trace=fork,clone 显示 fork() 返回后,紧跟着大量 write 系统调用延迟毛刺。

怎么确认 THP 当前是否启用

别只信 Redis 启动日志里的 WARNING,有些发行版(如 RHEL/CentOS 6+)把路径改成了 /sys/kernel/mm/redhat_transparent_hugepage/enabled,而 Redis 源码里硬编码读的是 /sys/kernel/mm/transparent_hugepage/enabled,所以可能没报错但问题照旧。

执行以下命令逐个检查:
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled(RHEL/CentOS 6+ 专用)
cat /proc/cmdline | grep transparent_hugepage

只要任一输出含 [always][madvise],就说明 THP 未真正禁用。

PyCharm 2026.2.0.1 Linux版
PyCharm 2026.2.0.1 Linux版

PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。

下载

永久关闭 THP 的可靠方法

临时关(重启失效)只用于验证:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
(注意:必须同时关 enableddefrag,否则 khugepaged 仍会活跃)

永久生效推荐两种方式,选其一:
– 修改 GRUB:在 /etc/default/grubGRUB_CMDLINE_LINUX 末尾加 transparent_hugepage=never,再运行 update-grub && reboot
– systemd 方式:新建 /etc/systemd/system/disable-thp.service,内容包含上述两个 echo 命令,并启用服务:systemctl daemon-reload && systemctl enable disable-thp.service

关键点:
– 不要用 /etc/rc.local:systemd 环境下该文件常被忽略,且执行时机不可控;
– 关完必须重启 Redis:THP 是进程启动时继承的内核策略,不重启 Redis 无效;
– 验证是否真关掉:除了看 enabled 文件,还要 grep AnonHugePages /proc/$(pgrep redis-server)/smaps | awk '{sum += $2} END {print sum}',结果应为 0。

THP 关闭后还需同步调整的 Redis 相关参数

关 THP 是治本,但若 RDB 仍高频触发,fork 峰值压力还在。建议配套调整:
– 把 save 规则从 save 60 10000 改为更宽松的 save 300 10,避免写入突增时密集 fork;
– 确保 no-appendfsync-on-rewrite yes,防止 AOF rewrite 和 RDB bgsave 叠加 fork;
– 检查 vm.overcommit_memory = 1(通过 sysctl vm.overcommit_memory 查),否则 fork 可能因内存预估失败直接返回 ENOMEM
– 别用 CONFIG SET save "" 动态清空规则——已排队的 bgsave 仍会执行,必须改配置 + redis-cli config rewrite + 重载或重启。

最易被忽略的一点:云服务器(尤其是容器化部署)可能由上层调度器强制启用 THP,即使你本地关了,也要登录宿主机确认。卡顿若依旧,先 stracefork 耗时,再看 AnonHugePages 是否归零——这两项不达标,其他优化都是白忙。

相关专题

更多
视频服务器配置参数有哪些
视频服务器配置参数有哪些

视频服务器配置参数有处理器、内存、存储、视频编解码器、网络接口、视频输入输出接口、操作系统、安全性、环境适应性和成本。在搭建视频服务器时,需要根据实际需求和预算,合理选择这些参数,以实现高性能、高稳定性和低成本的目标。

2023.10.17

1849

11

linux的操作系统介绍
linux的操作系统介绍

Linux是一个灵活、稳定、安全的操作系统,适用于各种不同的应用场景,从个人电脑到服务器和嵌入式系统。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.20

1658

12

Linux操作系统的主要用途
Linux操作系统的主要用途

Linux操作系统用途广泛,包括:服务器运营,软件开发,科学研究和教育,嵌入式系统,以及个人电脑和笔记本电脑。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.21

2280

8

linux操作系统的作用
linux操作系统的作用

linux操作系统在以下领域发挥着关键作用:服务器和云计算;嵌入式系统;个人电脑和笔记本电脑;超级计算;其他领域等等。想了解更多linux操作系统的相关内容,可以阅读本专题下面的文章。

2024.04.12

1117

5

有哪些常见的网络操作系统
有哪些常见的网络操作系统

常见的网络操作系统有windows server、linux、unix、macos server、freebsd、cisco ios、juniper junos和hp-ux等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.09.12

1564

6

32位操作系统怎么改成62位的
32位操作系统怎么改成62位的

要将 32 位操作系统升级到 64 位,需要遵循以下步骤:1. 检查硬件和软件兼容性;2. 备份数据;3. 获取 64 位操作系统;4. 创建可启动安装媒体;5. 从安装媒体启动计算机;6. 选择“升级”选项;7. 完成安装。

2025.04.02

2370

9

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

1884

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

1558

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

2426

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Apifox下载与安装手册
Apifox下载与安装手册

共0课时 | 0人学习

安装 Xdebug 并配置 phpstorm
安装 Xdebug 并配置 phpstorm

共1课时 | 127人学习