如何通过调整Redis的内存分配算法提升性能?

阿强大大_8268

阿强大大_8268

2026-07-22

990人浏览

原创

redis默认用jemalloc而非libc malloc,因其通过arena分区、tcache线程缓存和slab固定块管理,在高并发短生命周期对象场景下显著降低锁竞争与内存碎片,使碎片可预测收敛;而libc malloc易致碎片率高、rss/used_memory比值突破1.5。

如何通过调整redis的内存分配算法提升性能?

为什么 Redis 默认用 jemalloc 而不是 libc malloc

因为 libc malloc 在高并发、频繁分配释放小内存的场景下,锁竞争严重、碎片率高,used_memory_rss / used_memory 很容易突破 1.5。而 jemalloc 通过 arena 分区、tcache 线程缓存、slab 固定块管理,在 Redis 这类短生命周期对象密集的场景中更稳——它不是“不产生碎片”,而是让碎片可预测、可收敛。

切换内存分配器前必须验证的三件事

直接改 MALLOC 环境变量(如 export MALLOC=tcmalloc)可能引发隐性问题:

  • 确认 Redis 是从源码编译安装的(非 apt/yum 二进制包),否则 tcmalloc 或 jemalloc 可能未链接成功
  • 检查 INFO memory 中的 mem_allocator 字段是否真实生效,而不是仍显示 libc
  • 在相同负载下跑 10 分钟基准测试(如 redis-benchmark -t set,get -n 1000000 -c 50),对比 used_memory_rss 增长趋势和 instantaneous_ops_per_sec 波动,而非只看峰值 QPS

jemalloc 关键参数调优的实际影响

Redis 启动后可通过 mallctl 动态调整,无需重启。但要注意:这些参数作用于整个进程,不是 per-db 或 per-key。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • arenas.extend:控制 arena 扩展行为,默认为 1(自动扩展)。设为 0 可避免突发分配导致 RSS 暴涨,但可能增加分配延迟
  • stats.allocated 和 stats.resident 需配合监控,若前者远小于后者,说明大量内存被 jemalloc 持有但未归还 OS —— 此时调低 lg_chunk(默认 21,即 2MB)可能缓解
  • arenas.tcache_max 超过 64KB 后收益递减,生产环境建议设为 32768(32KB),既能加速小对象分配,又不至于让线程缓存吃掉过多 RSS

执行示例:echo 'arenas.tcache_max:32768' | sudo tee /proc/$(pidof redis-server)/fd/0(仅限 Linux,且需确保 Redis 以足够权限运行)

碎片整理不是万能解药,反而可能拖慢响应

开启 activedefrag yes 后,Redis 会在空闲时扫描并合并小碎片,但代价是 CPU 占用上升、延迟毛刺增多。真正该优先做的,是控制碎片来源:

  • 避免高频 DEL 小键 + 立即 SET 大键的混合操作——这会快速制造外部碎片
  • 对已知生命周期短的数据(如 session),用 EXPIRE 替代主动 DEL,让过期淘汰走统一路径,减少随机释放
  • memory purge 命令(Redis 6.2+)可强制 jemalloc 将空闲页还给 OS,但它会阻塞主线程几十毫秒,只能在低峰期手动触发,不能写进 cron

碎片率 >1.5 时,先查 INFO memory 的 mem_fragmentation_ratio 和 mmap_used_bytes,若后者占比高,说明大对象(如 RDB/AOF 内存映射)占了 RSS 主要部分——这时调分配器参数意义不大,得从数据结构或持久化策略入手。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

4756

4

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

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

2023.11.02

4109

19

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

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

2023.11.14

3575

11

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

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

2024.04.02

6352

6

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

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

2024.04.07

603

6

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

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

2024.04.07

716

6

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

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

2024.04.07

5802

6

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

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

2024.04.07

1140

6

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

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

2024.04.07

936

6

热门下载

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

精品课程

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

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习