做技术分享网站 盈利,中国石化工程建设有限公司邮政编码,北京网站推广营销策划,有哪些app软件开发公司最近查看了一下redis运行状况#xff0c;发现公司测试服务器的redis内存不太够用#xff0c;但是实际占用内存的数据量其实不大#xff0c;以前也没有这种情况#xff0c;之前在cache层新增了一个防刷积分任务的逻辑才会这样#xff0c;搜索一下原因#xff0c;发现原来是… 最近查看了一下redis运行状况发现公司测试服务器的redis内存不太够用但是实际占用内存的数据量其实不大以前也没有这种情况之前在cache层新增了一个防刷积分任务的逻辑才会这样搜索一下原因发现原来是产生了大量的内存碎片。
首先查看redis的内存状态要用info memory指令 图中几个参数的意义
1、used_memory
已经使用了的内存大小包括redis进程内部开销和你的cache的数据所占用的内存单位byte。
2、used_memory_human
用户数据所占用的内存就是你缓存的数据的大小。
3、used_memory_rssrss for Resident Set Size
表示redis物理内存的大小即向OS申请了多少内存使用与used_memory的区别在后面解释。
4、used_memory_peak
redis内存使用的峰值。
5、used_memory_peak_human
用户cache数据的峰值大小。
6、used_memory_lua
执行lua脚本所占用的内存。
7、mem_fragmentation_ratio 内存碎片率计算公式 ratio指数1表明有内存碎片越大表明越多1表明正在使用虚拟内存虚拟内存其实就是硬盘性能比内存低得多这是应该增强机器的内存以提高性能。一般来说mem_fragmentation_ratio的数值在1 ~ 1.5之间是比较健康的。
8、mem_allocator
在编译时指定的Redis使用的内存分配器可以是libc、jemalloc、tcmalloc默认是jemalloc。jemalloc在64位系统中将内存空间划分为小、大、巨大三个范围每个范围内又划分了许多小的内存块单位存储数据的时候会选择大小最合适的内存块进行存储。 jemalloc划分的内存单元如下图所示 ----------------------------------------------------- 分割线 ------------------------------------------------
产生原因
可以这样认为redis产生内存碎片有两个原因 Aredis自身的内存分配器。 B修改cache的值且修改后的value与原来value的大小差异较大。
进程需要用内存的话会先通过OS向device申请然后才能够使用。一般进程在不需要使用的时候会释放掉这部分内存并返回给device。但是redis作者可能为了更高的性能所以在redis中实现了自己的内存分配器来管理内存不会马上返还内存不用每次都向OS申请了从而实现高性能。
但是在内存分配器的那张图片我们知道redis的每个k-v对初始化的内存大小是最适合的当这个value改变的并且原来内存大小不适用的时候就需要重新分配内存了。但是value存比原来小不知道会不会产生碎片。重新分配之后就会有一部分内存redis无法正常回收一直占用着。
----------------------------------------------------- 分割线 ------------------------------------------------
知道了原因就可以解决问题了网上找到了两个解决方案 1、重启redis服务简单粗暴。 2、redis4.0以上可以使用新增指令来手动回收内存碎片配置监控使用性能更佳具体大家可以自己去查。
这里提个问题如果是单机redis想要不停服务重启redis大家有什么好的想法