内存碎片大家都已经耳熟能详了。当Redis数据删除后,Redis释放的内存空间可能不是连续的,这就会带来一个问题,这些不连续的内存空间有可能处于闲置的,但是redis缺无法来保存数据,这就会减低Redis保存的数据量。

那我们该如何来判断Redis是否存在内存碎片呢?

Redis提供了一个Info memory命令,可以用来查询内存使用的详细信息。如下所示。

127.0.0.1:6379> info memory
# Memory
used_memory:1074976
used_memory_human:1.03M
used_memory_rss:1548288
used_memory_rss_human:1.48M
used_memory_peak:1075888
used_memory_peak_human:1.03M
used_memory_peak_perc:99.92%
used_memory_overhead:1071226
used_memory_startup:987328
used_memory_dataset:3750
used_memory_dataset_perc:4.28%
allocator_allocated:1041632
allocator_active:1502208
allocator_resident:1502208
total_system_memory:17179869184
total_system_memory_human:16.00G
used_memory_lua:46080
used_memory_lua_human:45.00K
used_memory_scripts:216
used_memory_scripts_human:216B
number_of_cached_scripts:1
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.44
allocator_frag_bytes:460576
allocator_rss_ratio:1.00
allocator_rss_bytes:0
rss_overhead_ratio:1.03
rss_overhead_bytes:46080
mem_fragmentation_ratio:1.49
mem_fragmentation_bytes:506656
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:83538
mem_aof_buffer:0
mem_allocator:libc
active_defrag_running:0
lazyfree_pending_objects:0
复制代码

注意,这里有一个mem_fragmentation_ratio的指标,这个就代表了Redis的内存碎片率,它的计算方式是used_memory_rss 和 used_memory 相除。

  • used_memory_rss 是操作系统实际分配给Redis的物理内存空间,里面就包含了碎片;
  • used_memory 是Redis为了保存数据实际申请使用的空间。

当我们发现mem_fragmentation_ratio这个指标大于1.5,这就表明内存的碎片碎片使用率超过了50%,我们就需要来采取措施减低内存碎片率了。

如何清理内存碎片

最简单粗暴的方式就是重启redis,但是这对于线上服务来说是不友好的,那有没有更好的办法呢,自从Redis 4.0-RC3版本开始,Redis自身提供了一种内存碎片自动清理方法,当redis需要启用自动内存碎片清理,可以把activedefrag设置为yes。这个命令只是启动了了自动清理功能。具体怎么清理有下面两个参数的配置来控制。如果同时满足这两个条件,就开始清理,如果有一个不满足,就停止清理。

  • active-defrag-ignore-bytes 120mb 表示内存碎片的字节数达到120MB时,开始清理;
  • active-defrag-threshold-lower 15% 表示内存碎片空间占操作系统分配给Redis的总空间比例达到15%时,开始清理。

Redis为了减低内存碎片清理对正常请求的影响,在自动内存碎片清理执行过程中,会监控清理操作占用CPU的时间,有两个参数分别用于控制清理操作占用CPU时间的上下限。

  • active-defrag-cycle-min 30: 表示自动清理过程所用CPU时间的比例不低于30%,保证清理能正常开展;

  • active-defrag-cycle-max 70: 表示自动清理过程所用 CPU 时间的比例不高于 70%,一旦超过,就停止清理,从而避免在清理时,影响redis的正常操作。

    今天我们关于Redis的内存碎片就聊到这。更多硬核知识,请关注公众号【程序员学长】。

Redis内存碎片的更多相关文章

  1. Redis内存碎片率

    一. 内存碎片率mem_fragmentation_ratio = used_memory_rss / used_memoryused_memory :Redis使用其分配器分配的内存大小used_m ...

  2. Redis内存碎片清理

    当Redis中清理了大量的Key之后原先Redis申请的内存(used_memory_rss)将继续持有而不会释放,此时查看内存信息将会看到存在大量的内存碎片.那么,Redis的内存碎片可以清理么,该 ...

  3. redis调优 -- 内存碎片

    最近查看了一下redis运行状况,发现公司测试服务器的redis内存不太够用,但是实际占用内存的数据量其实不大,以前也没有这种情况,之前在cache层新增了一个防刷积分任务的逻辑才会这样,搜索一下原因 ...

  4. [转]细说Redis监控和告警

    原文  https://zhuoroger.github.io/2016/08/20/redis-monitor-and-alarm/? 对于任何应用服务和组件,都需要一套完善可靠谱监控方案. 尤其r ...

  5. redis安装,配置

    下载 cd /usr/local/src wget http://download.redis.io/releases/redis-3.0.7.tar.gz     安装 yum install je ...

  6. 深入学习Redis(1):Redis内存模型

    前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...

  7. 深入理解Redis内存模型

    前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...

  8. 深入学习Redis:Redis内存模型

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一.Redis内存统计 工欲善其事必先利其器,在说明Redis内存之前首先说明如何统计 ...

  9. Redis 内存模型

    了解 Redis 的 5 种对象类型(字符串.哈希.列表.集合.有序集合)的用法和特点的基础,了解 Redis 的内存模型,对 Redis 的使用有很大帮助,例如: 估算 Redis 内存使用量.内存 ...

随机推荐

  1. apache 2.2 静态文件目录的配置

    引用 #禁止使用proxy_ajp代理的目录: ProxyPass /sns/images/ ! #使用proxy_ajp代理:下面的配置,是把所有目录全用代理(当然,还会跟上面的禁用配置组合成完整的 ...

  2. 线程中的yield()

    属于本地方法 /** * A hint to the scheduler that the current thread is willing to yield * its current use o ...

  3. makedown语法小记

    1.标题,支持六级 # 这是一级标题 ## 这是二级标题 ### 这是三级标题 2.斜体 *这是斜体* 3.加粗 **这是加粗** 4.斜体加粗 ***这是斜体加粗*** 5.删除线 ~~这是删除线~ ...

  4. 备战-Java 基础

    备战-Java 基础 仰天大笑出门去,我辈岂是蓬蒿人. 简介:备战-Java 基础. 一.基本数据类型 1.Java基本数据类型 基本数据类型有8种:byte.short.int.long.float ...

  5. [转载]API网关

    1. 使用API网关统一应用入口 API网关的核心设计理念是使用一个轻量级的消息网关作为所有客户端的应用入口,并且在 API 网关层面上实现通用的非功能性需求.如下图所示:所有的服务通过 API 网关 ...

  6. QT. 学习之路 二

    Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽. 举报纸和订阅者的例子:有一个报纸类 Newspaper,有一个订阅者类 Subscriber.Subscribe ...

  7. python 遍历文件夹中所有文件

    '''使用walk方法递归遍历目录文件,walk方法会返回一个三元组,分别是root.dirs和files. 其中root是当前正在遍历的目录路径:dirs是一个列表,包含当前正在遍历的目录下所有的子 ...

  8. asp.net 简明代码

    <asp:RadioButton ID="daadaa" runat="server" GroupName="dada" OnChec ...

  9. [刘阳Java]_TortoiseSVN基础应用_第1讲

    TortoiseSVN是一个免费的SVN客户端,非常好用.这里我们介绍一下TortoiseSVN基础应用. 下面的内容是转载博客园的某兄弟写的,个人觉得很不错.所以尊重转载的这篇文章,必须要给出这篇博 ...

  10. vue(21)初识Vuex

    Vuex是做什么的? 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式. 它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex ...