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 内存使用量.内存 ...
随机推荐
- XML:使用cxf调用WebService接口时报错:编码GBK的不可映射字符(设置UTF-8字符集)
调用代码如下 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf. ...
- gitolite安装及配置
1.客户端(1)使用ssh-keygen命令在当前用户根目录下生成密钥(2)将该密钥远程拷贝到gitserver服务器上:scp ~/.ssh/id_rsa.pub user@ip:/tmp/neu. ...
- phpredis中文手册
本文是参考<redis中文手册>,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法). 目录(使用CTRL+F快速查找命令): Key ...
- gitlab git 安装
1.配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] name=Gitlab CE Repository baseurl=https://m ...
- F5的IPv6配置指导
1.配置核心思想: 配置IPv6的默认路由 配置IPv6的VS IPv6的vs里面要启用"automap" 2.配置IPv6的默认路由 3.配置IPv6的VS 第一种方法: 第二种 ...
- 视频场景切换检测的FPGA实现
本文将继续讲述图像处理算法的FPGA实现,后续可能更新图像旋转(1080P).画中画.快速DCT等算法.视频场景切换检测常用于视频编解码领域,我选用的算法是双阈值灰度直方图检测法,起初在MATLAB上 ...
- 【技巧】使用PPT更换背景色
主要记述使用PPT来更换图片某一部分的背景色 把想要更改的图片粘贴到PPT里. 依次选择[格式][颜色][设置透明色],然后点击需要更改背景的地方 将自己的目标颜色复制一下,填充上去,选择[置于底层]
- Python多线程爬取某网站表情包
# 爬取网络图片import requestsfrom lxml import etreefrom urllib import requestfrom queue import Queue # 导入队 ...
- pip install 默认安装路径修改
一.使用命令查看pip默认安装目录 python -m site 这里的USER_BASE和USER_SITE其实就是默认的启用Python通过pip自动下载的脚本和依赖安装包的基础路径. 接着使用命 ...
- pip3 pip 安装包 临时更换镜像地址
在使用pip3或者pip安装某些第三方包的时候,可能会遇到网络原因导致的安装失败. 可以在安装第三方包的时候临时指定镜像地址. 命令: pip3 install 库名 -i 镜像地址 例如:# pip ...