Redis内存碎片
内存碎片大家都已经耳熟能详了。当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内存碎片的更多相关文章
- Redis内存碎片率
一. 内存碎片率mem_fragmentation_ratio = used_memory_rss / used_memoryused_memory :Redis使用其分配器分配的内存大小used_m ...
- Redis内存碎片清理
当Redis中清理了大量的Key之后原先Redis申请的内存(used_memory_rss)将继续持有而不会释放,此时查看内存信息将会看到存在大量的内存碎片.那么,Redis的内存碎片可以清理么,该 ...
- redis调优 -- 内存碎片
最近查看了一下redis运行状况,发现公司测试服务器的redis内存不太够用,但是实际占用内存的数据量其实不大,以前也没有这种情况,之前在cache层新增了一个防刷积分任务的逻辑才会这样,搜索一下原因 ...
- [转]细说Redis监控和告警
原文 https://zhuoroger.github.io/2016/08/20/redis-monitor-and-alarm/? 对于任何应用服务和组件,都需要一套完善可靠谱监控方案. 尤其r ...
- redis安装,配置
下载 cd /usr/local/src wget http://download.redis.io/releases/redis-3.0.7.tar.gz 安装 yum install je ...
- 深入学习Redis(1):Redis内存模型
前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...
- 深入理解Redis内存模型
前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...
- 深入学习Redis:Redis内存模型
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一.Redis内存统计 工欲善其事必先利其器,在说明Redis内存之前首先说明如何统计 ...
- Redis 内存模型
了解 Redis 的 5 种对象类型(字符串.哈希.列表.集合.有序集合)的用法和特点的基础,了解 Redis 的内存模型,对 Redis 的使用有很大帮助,例如: 估算 Redis 内存使用量.内存 ...
随机推荐
- ThreadLocal底层原理学习
1. 是什么? 首先ThreadLocal类是一个线程数据绑定类, 有点类似于HashMap<Thread, 你的数据> (但实际上并非如此), 它所有线程共享, 但读取其中数据时又只能是 ...
- bson的类型
BSON是JSON的扩展数据类型
- 在使用XStream时没有processAnnotations方法
https://stackoverflow.com/questions/28770909/xstream-processannotations 我遇到这个问题的原因是xstream.jar的版本问题 ...
- ROS踩坑笔记总结
2019-07-12 11:32:16 我的第一篇原创博客(当然是站在巨人肩膀上,有些内容参考了其他大神的博客,都一一做了说明),这些是我之前在学习ROS期间经历的一些坑,以及相对应的解决方案,希望可 ...
- Apache Superset 1.2.0教程 (二)——快速入门(可视化王者英雄数据)
上一篇我们已经成功的安装了superset,那么该如何可视化我们的数据呢?本文将可视化王者英雄的数据,快速的入门Superset. 一.连接数据源 首先确保mysql可以正常连接使用,并且准备好数据. ...
- mongodb常用查询语句(转)
1.查询所有记录 db.userInfo.find();相当于:select* from userInfo; 2.查询去掉后的当前聚集集合中的某列的重复数据db.userInfo.distinct(& ...
- python mysql类
import pymysql class MysqlHelper(object): conn = None def __init__(self, host, username, password, d ...
- 高校表白App-团队冲刺第五天
今天要做什么 封装Adapter制作引导页 今天做了什么 成功封装工具类,为以后的轮播做了铺垫 遇到的问题 在封装时采用数组容器进行操作,只能添加图片作为元素,对于layout不可加入
- [刘阳Java]_为什么要前后端分离
前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多 ...
- [刘阳Java]_Spring相关配置介绍_第5讲
这一节我们介绍一下Spring框架的相关常用配置 Spring依赖注入的两种方式(构造方法注入和setter方式注入) p-namespace方式配置 properties属性文件配置方式 集合对象配 ...