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 内存使用量.内存 ...
随机推荐
- Kafka:Springboot整合Kafka消息队列
本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 项目结构 pom依赖包 <?xml version="1 ...
- MySql:使用Navicat定时备份数据库
Navicat自带就有备份 还可以直接计划任务,很方便. 1. 新建计划 打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击" ...
- python opencv处理图片
1.图像读入:cv2.imread() 使用函数cv2.imread(filepath,flags) 读入图像.第二个参数是要告诉函数应该如何读取这幅图片. cv2.IMREAD_COLOR:默认参数 ...
- XCTF python-trade
一.查看文件类型 后缀名为pyc,说明是python字节码文件,python和java在编译方式上很像,都是编译兼并解释型,先编译成字节码,在虚拟机上解释成机器代码. 二.反编译 三.写个exp 分析 ...
- 第16章 pyinstaller库的使用
pyinstaller库概述 将.py源代码,转换成无需源代码的可执行文件 .py文件通过pyinstaller转换成windows.linux以及mac的可执行文件 pyinstaller库是第三方 ...
- QT从入门到入土(三)——文件的读写操作
引言 文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能. Qt 提供了两种读写纯文本文件的基本方法: 用 QFi ...
- 「CF527E」 Data Center Drama
「CF527E」 Data Center Drama 传送门 显然一个环肯定满足题目条件. 然后我就开始想:先整一棵 \(\texttt{DFS}\) 树,然后非树边从深度深的节点向深度浅的节点连边, ...
- PyVista:一款Python的三维可视化软件
技术背景 三维可视化是一项在工业领域中非常重要的技术,而Python中最热门的可视化工具matplotlib和plotly,更加倾向于在数据领域的可视化,用于展现数据的结果.类似的还有百度的pyech ...
- Leetcode春季打卡活动 第二题:206. 反转链表
Leetcode春季打卡活动 第二题:206. 反转链表 206. 反转链表 Talk is cheap . Show me the code . /** * Definition for singl ...
- 微信机器人项目开发--python
1.外网穿透工具下载与注册[http://ngrok.ciqiuwl.cn/] 2.公众号审请 3.代码编写 糗事百科接口 # _*_ coding:utf-8 _*_ import requests ...