如何处理Redis持久化导致的Copy-on-Write内存溢出_通过调整Linux内核overcommit参数

P粉602998670

P粉602998670

2026-06-16

587人浏览

原创

设vm.overcommit_memory=1可跳过fork前内存检查,使cow机制正常生效,避免“cannot allocate memory”错误;但必须配合禁用thp并监控mem_fragmentation_ratio≤1.5,否则仍会因大页合并加剧cow开销导致rss异常飙升。

如何处理redis持久化导致的copy-on-write内存溢出_通过调整linux内核overcommit参数

直接设 vm.overcommit_memory = 1 是最有效、最常被验证的缓解手段,但它不是万能解药——必须配合禁用透明大页(THP)和观察 mem_fragmentation_ratio 才能真正稳住。

为什么 vm.overcommit_memory = 1 能缓解 COW 内存爆增

Redis 在执行 bgsavebgrewriteaof 时会 fork 子进程,内核启用写时复制(COW)。此时若 vm.overcommit_memory = 0(默认),内核会在 fork 前检查是否有足够物理内存“承诺”给子进程(即使子进程实际只读、暂不分配新页),检查失败就直接拒绝 fork,报 Cannot allocate memory 错误;设为 1 后,内核跳过该检查,“先 fork 再按需分配”,让 COW 机制真正起作用。

常见错误现象:

  • 日志里反复出现 Can't save in background: fork: Cannot allocate memory
  • redis-cli info memoryused_memory_rss 突然翻倍,但 used_memory 几乎不变
  • 系统 free -h 显示可用内存充足,但 Redis 仍 fork 失败

实操建议:

  • 临时生效:echo 1 > /proc/sys/vm/overcommit_memory
  • 永久生效:在 /etc/sysctl.conf 加一行 vm.overcommit_memory = 1,再执行 sysctl -p
  • 不要设为 2:它依赖 overcommit_ratio 计算“硬上限”,在 COW 场景下反而更容易触发 OOM killer

禁用透明大页(THP)是强制配套动作

vm.overcommit_memory = 1 单独启用后,如果系统仍启用了透明大页(THP),khugepaged 后台线程会持续扫描 Redis 进程的匿名内存页,尝试合并为 2MB 大页。而 Redis 内存访问模式高度随机、写入频繁,THP 不仅无法提升性能,还会加剧页表分裂、增加 COW 开销,导致 fork 后 RSS 比预期高 30%–50%。

确认是否启用:

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 项目开发、运行和调试的用户。

下载
  • cat /sys/kernel/mm/transparent_hugepage/enabled 输出含 [always][madvise] 即为启用
  • cat /sys/kernel/mm/transparent_hugepage/defrag 若非 never,也会引发干扰

实操建议:

  • 立即禁用:echo never > /sys/kernel/mm/transparent_hugepage/enabledecho never > /sys/kernel/mm/transparent_hugepage/defrag
  • 永久禁用:写入 /etc/rc.local 或创建 systemd drop-in(如 /etc/systemd/system/disable-thp.service
  • 重启 Redis 之前必须 reload,否则旧进程仍受 THP 影响

观察 mem_fragmentation_ratio 判断是否真缓解了问题

设完 overcommit_memory = 1 和禁用 THP 后,不能只看 Redis 是否不再报 fork 失败——还要验证内存行为是否回归合理区间。关键指标是 redis-cli info memory | grep mem_fragmentation_ratio

含义与判断:

  • mem_fragmentation_ratio ≈ 1.0–1.4:正常,说明 used_memory_rssused_memory 接近,COW 未引发异常页分裂
  • > 1.5:碎片严重,可能是伙伴系统高阶分配失败、或仍有 THP 干扰,需查 dmesg | grep -i "compact"
  • :说明 Redis 进程内存被 swap 了,<code>used_memory_rss 小于实际使用量,性能已受损,必须关 swap(swapoff -a)并排查为何没触发 OOM killer

实操建议:

  • 每次持久化前后用 redis-cli info memory 对比 used_memory_rss 增幅,理想增幅应 ≤ 10%
  • 长期运行中若 mem_fragmentation_ratio 持续缓慢爬升,考虑升级到 Redis 7+ 并启用 memory purge 定期整理
  • 不要依赖 CONFIG SET maxmemory 来“掩盖”碎片问题——它只限制逻辑内存,不解决物理内存分配异常

最关键的遗漏点是:很多人调完 overcommit_memory 就以为万事大吉,却忘了 THP 默认开启且重启不失效,而 overcommit_memory 的效果在 THP 干扰下会打五折。这两个参数必须成对调整,缺一不可。

相关专题

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

常用的数据库软件有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

2424

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

518

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

524

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

2425

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

915

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

687

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

2307

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 9万人学习