Redis持久化时内存占用过高_排查Linux系统内存页分配策略

P粉602998670

P粉602998670

2026-05-13

856人浏览

原创

redis持久化期间内存突增主因是linux内核cow机制下页表分裂与大页干扰,需禁用透明大页、调优伙伴系统及redis配置:关闭activerehashing、启用incremental-fsync、调整vfs_cache_pressure等。

redis持久化时内存占用过高_排查linux系统内存页分配策略

Redis持久化(尤其是 bgsavebgrewriteaof)期间内存占用突增,往往不是 Redis 自身数据膨胀导致的,而是 Linux 内核在写时复制(Copy-on-Write, COW)机制下,对 fork 出的子进程页表进行大量页分裂和映射操作引发的——根源在内存页分配策略与大页(Huge Page)是否启用。

为什么 Redis fork 后内存翻倍甚至更高

Redis 主进程使用 mmap + 堆内存混合管理数据,fork 时内核采用 COW 策略:子进程共享父进程所有物理页的只读映射,但一旦任一进程写入某页,内核需为该页分配新物理页并复制内容。问题在于:

  • 若父进程大量使用匿名内存(如 malloc 分配的堆),这些页默认是 4KB 小页,COW 触发时需逐页复制,但更关键的是:这些页的页表项(PTE)无法被 TLB 高效缓存
  • 如果系统启用了透明大页(thp),且 Redis 进程内存分布不连续或存在频繁写入,khugepaged 可能持续尝试合并小页 → 引发额外内存扫描与临时映射开销
  • /proc/sys/vm/overcommit_memory 设为 2 时,内核按 overcommit_ratio 限制实际可分配内存,fork 前检查可能失败,但 fork 后子进程首次写入才真正分配,此时若物理内存紧张,会触发直接回收或 OOM killer

检查当前是否启用透明大页(THP)

透明大页对 Redis 是已知风险项,它会干扰 COW 行为并增加内存碎片压力。确认方式:

cat /sys/kernel/mm/transparent_hugepage/enabled

输出若为 [always] madvise neveralways,说明已启用;应改为 never

echo never > /sys/kernel/mm/transparent_hugepage/enabled

注意:该设置重启失效,需写入 /etc/rc.local 或 systemd drop-in;同时检查 /sys/kernel/mm/transparent_hugepage/defrag 是否也为 never,避免后台线程强行合并页。

验证伙伴系统是否因高阶分配阻塞

当 Redis 持久化子进程需要大量连续内存(例如加载 RDB 到内存做校验、AOF 重写缓冲区扩容),内核需从伙伴系统中分配高 order 内存块。若 free_area[order] 中空闲块不足,会触发内存规整(compaction)或直接回收,表现为 kswapd CPU 升高、延迟毛刺。

宝塔Linux面板11.8.1
宝塔Linux面板11.8.1

宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。

下载

查看各阶空闲页数量:

cat /proc/buddyinfo

重点关注 order-9(512 × 4KB = 2MB)及以上阶数是否长期为 0。若 order-10(4MB 块)持续为 0,说明物理内存碎片严重,无法满足大块连续分配需求 —— 此时即使总空闲内存充足,alloc_pages(GFP_KERNEL, 10) 仍可能失败或阻塞。

临时缓解方法(仅限调试):

  • 运行 echo 1 > /proc/sys/vm/compact_memory 手动触发内存规整
  • 观察 /proc/sys/vm/swappiness 是否过高(>10),高值会倾向 swap 而非回收 page cache,加剧规整压力
  • 避免在 Redis 服务器上运行其他内存密集型服务(如 Java 应用未设 -XX:+UseG1GC),减少伙伴系统干扰

Redis 配置层规避页分配压力

内核页策略无法绕过,但可通过 Redis 配置降低对高阶页的需求频率和规模:

  • 禁用 activerehashing yes(默认开启),防止 BGREWRITEAOF 期间哈希表渐进式 rehash 导致额外内存申请
  • 调小 client-output-buffer-limit,尤其 pub/sub 类客户端,避免输出缓冲区无节制增长
  • 对 AOF 重写,显式设置 aof-rewrite-incremental-fsync yes,让 fsync 分批进行,减少单次 write 系统调用引发的页脏化与回写压力
  • 如使用 Redis 7+,启用 lazyfree-lazy-eviction yeslazyfree-lazy-expire yes,将 key 删除的内存释放异步化,避免主线程阻塞在 __pagevec_release

最关键的遗漏点:很多人只盯着 redis.conf,却忽略 /proc/sys/vm/vfs_cache_pressure。该值若远高于默认 100(比如设为 200),内核会激进回收 dentry/inode 缓存,间接导致更多文件页换入换出,加剧伙伴系统负载 —— 它和 Redis 持久化没有直接关系,但在高负载下会成为压垮内存分配的最后一根稻草。

相关专题

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

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

2427

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

2426

6

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

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

2024.04.07

937

6

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

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

2024.04.07

687

6

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

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

2024.04.07

2329

6

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共1课时 | 127人学习