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

翻看了Redis的相关资料发现,Redis4版本之后开始支持内存碎片的清理,于是进行了一次测试,内容如下:

1.  搭建Redis

搭建一个Redis,版本为4.0.14.搭建步骤参考历史博文或微信公众号,步骤相对简单,没有太多幺蛾子,很快便可以搭建成功。

2.  插入一堆Key,使其内存占用很大

可以批量写一个循环,插入大量key。

3.  删除90%以上的key

循环删除key或在创建key时设置过期时间,待key删除或过期之后,可以查看内存的情况。

127.0.0.1:> info memory
# Memory
used_memory:
used_memory_human:130.69M
used_memory_rss:
used_memory_rss_human:.90G
used_memory_peak:
used_memory_peak_human:.26G
used_memory_peak_perc:1.13%
used_memory_overhead:
used_memory_startup:
used_memory_dataset:
used_memory_dataset_perc:98.03%
total_system_memory:
total_system_memory_human:.70G
used_memory_lua:
used_memory_lua_human:.00K
maxmemory:
maxmemory_human:.18G
maxmemory_policy:noeviction
mem_fragmentation_ratio:85.42
mem_allocator:jemalloc-4.0.
active_defrag_running:
lazyfree_pending_objects:

可以发现实际使用内存为130.69M,而Redis申请的内存为10.90G,碎片率mem_fragmentation_ratio为85.42,相当高了

4.  清理内存碎片

默认情况下自动清理碎片的参数是关闭的,可以按如下命令查看

127.0.0.1:> config get activedefrag
) "activedefrag"
) "no"

启动自动清理内存碎片

127.0.0.1:> config set  activedefrag yes
OK

开启后再查看内存信息

127.0.0.1:> info memory
# Memory
used_memory:
used_memory_human:131.64M
used_memory_rss:
used_memory_rss_human:.71G
used_memory_peak:
used_memory_peak_human:.26G
used_memory_peak_perc:1.14%
used_memory_overhead:
used_memory_startup:
used_memory_dataset:
used_memory_dataset_perc:97.84%
total_system_memory:
total_system_memory_human:.70G
used_memory_lua:
used_memory_lua_human:.00K
maxmemory:
maxmemory_human:.18G
maxmemory_policy:noeviction
mem_fragmentation_ratio:36.61
mem_allocator:jemalloc-4.0.
active_defrag_running:
lazyfree_pending_objects:

此时redis占用的内存used_memory_rss已降低至4.71G了,内存碎片为36.61

5. 查看内存分配情况

此时也可以查看内存分配情况,其中重要的指标是查看bins里的util,此时可以发现当前最大的已达到0.998(1除外)

127.0.0.1:> memory malloc-stats
___ Begin jemalloc statistics ___
Version: 4.0.--ge9192eacf8935e29fc62fddc2701f7942b1cc02c
Assertions disabled
Run-time option settings:
opt.abort: false
opt.lg_chunk:
opt.dss: "secondary"
opt.narenas:
opt.lg_dirty_mult: (arenas.lg_dirty_mult: )
opt.stats_print: false
opt.junk: "false"
opt.quarantine:
opt.redzone: false
opt.zero: false
opt.tcache: true
opt.lg_tcache_max:
CPUs:
Arenas:
Pointer size:
Quantum size:
Page size:
Min active:dirty page ratio per arena: :
Maximum thread-cached size class:
Chunk size: (^)
Allocated: , active: , metadata: , resident: , mapped:
Current active ceiling: arenas[]:
assigned threads:
dss allocation precedence: secondary
min active:dirty page ratio: :
dirty pages: : active:dirty, sweeps, madvises, purged
allocated nmalloc ndalloc nrequests
small:
large:
huge:
total:
active:
mapped:
metadata: mapped: , allocated:
bins: size ind allocated nmalloc ndalloc nrequests curregs curruns regs pgs util nfills nflushes newruns reruns
0.720
0.435
0.152
0.195
0.019
0.148
0.006
0.175
0.711
0.875
0.996
0.982
0.997
0.882
0.990
0.987
0.775
0.881
0.955
0.982
0.964
0.989
0.930
0.995
0.984
0.994
0.982 0.994
0.991 0.998
0.994
0.991 0.992
large: size ind allocated nmalloc ndalloc nrequests curruns huge: size ind allocated nmalloc ndalloc nrequests curhchunks ---
--- End jemalloc statistics ---

6.  手动清理

其实还可以手动清理,可以采用如下命令

127.0.0.1:> memory purge
OK

7. 相关参数配置说明

内存清理相关参数如下,可以使用config get的方式查看对应的值

# Enabled active defragmentation
# 碎片整理总开关
# activedefrag yes # Minimum amount of fragmentation waste to start active defrag
# 内存碎片达到多少的时候开启整理
active-defrag-ignore-bytes 100mb # Minimum percentage of fragmentation to start active defrag
# 碎片率达到百分之多少开启整理
active-defrag-threshold-lower 10 # Maximum percentage of fragmentation at which we use maximum effort
# 碎片率小余多少百分比开启整理
active-defrag-threshold-upper 100 # Minimal effort for defrag in CPU percentage
active-defrag-cycle-min 25 # Maximal effort for defrag in CPU percentage
active-defrag-cycle-max 75

至此,Redis4.0.14版本的内存碎片清理就测试完成了。

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

  1. Redis内存碎片率

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

  2. redis4支持内存碎片清理功能使用

    最近看到redis4支持内存碎片清理了, 之前一直期待有这么一个功能, 因为之前遇到内存碎片的解决办法就是重启, 现在终于有了优雅的解决方案.\^o^/, 这个功能其实oranagra 在2017年1 ...

  3. Redis内存碎片

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

  4. Redis缓存清理

    Redis缓存清理 学习了:https://www.cnblogs.com/ZnCl/p/7116870.html 使用 redis-cli.exe登录, 使用flushall 命令: 或者key * ...

  5. redis调优 -- 内存碎片

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

  6. Linux实战教学笔记45:NoSQL数据库之redis持久化存储(一)

    第1章 redis存储系统 1.1 redis概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统.redis和大名鼎鼎的Mem ...

  7. 败家玩意儿!Redis 竟然浪费了这么多内存!

    作为内存数据库,内存空间大小对于 Redis 来说是至关重要的.内存越多,意味着存储的数据也会越多.但是不知道你有没有遇到过这样的情况,明明空间很大,但是内存的使用却不是很理想. 为什么会出现这样的情 ...

  8. 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法

    "为什么这个功能用不了?" 程序员:"清一下缓存" 上篇洞悉系列文章给大家详细介绍了MySQL的存储内幕:洞悉MySQL底层架构:游走在缓冲与磁盘之间.既然聊过 ...

  9. 关于Redis数据过期策略

    1.Redis中key的的过期时间 通过EXPIRE key seconds命令来设置数据的过期时间.返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间.在key上设置了过期时间后ke ...

随机推荐

  1. hdu 1754 I Hate It(线段树区间求最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. P1113 同颜色询问

    题目描述 现在有一个包含 \(n\) 个元素的数组,它的元素的编号从 \(1\) 到 \(n\) . 每一个元素都有一个初始的颜色 \(C_i\) 以及数值 \(W_i\) . 这个数组支持 \(4\ ...

  3. 洛谷P5019 铺设道路 题解 模拟/贪心基础题

    题目链接:https://www.luogu.org/problemnew/show/P5019 这道题目是一道模拟题,但是它有一点贪心的思想. 我们假设当前最大的深度是 \(d\) ,那么我们需要把 ...

  4. 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用

    题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...

  5. C# AddRange 添加位置

    有没人想知道, AddRange 添加位置 是哪? 是添加到数组的开始,还是数组的末尾? 假如有一个 代码,看起来是下面的,很简单,把一个 list b 放进list a List<int> ...

  6. PHP会员找回密码功能的简单实现

    文章来自:博客 http://www.jb51.net/article/91944.htm 设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名 ...

  7. HDU 1540 Tunnel Warfare (线段树)

    Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...

  8. tf.reduce_sum()

    #axis 表示在哪个维度进行sum操作,不写代表所有维 #keep_dims 是否保留原始数据维度 reduce_sum( input_tensor, axis=None, keep_dims=Fa ...

  9. linux一个进程如何睡眠

    如果我们深入 <linux/wait.h>, 你见到在 wait_queue_head_t 类型后面的数据结构是非 常简单的; 它包含一个自旋锁和一个链表. 这个链表是一个等待队列入口, ...

  10. 2018-9-14-win10-UWP-标题栏后退

    title author date CreateTime categories win10 UWP 标题栏后退 lindexi 2018-9-14 20:22:8 +0800 2018-2-13 17 ...