redis调优 -- 内存碎片

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

首先,查看redis的内存状态,要用info memory指令

 

图中几个参数的意义:

1、used_memory:

已经使用了的内存大小,包括redis进程内部开销和你的cache的数据所占用的内存,单位byte。

2、used_memory_human:

用户数据所占用的内存,就是你缓存的数据的大小。

3、used_memory_rss:(rss 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产生内存碎片有两个原因,
A:redis自身的内存分配器。
B:修改cache的值,且修改后的value与原来value的大小差异较大。

进程需要用内存的话,会先通过OS向device申请,然后才能够使用。一般进程在不需要使用的时候,会释放掉这部分内存并返回给device。但是redis作者可能为了更高的性能,所以在redis中实现了自己的内存分配器来管理内存,不会马上返还内存,不用每次都向OS申请了,从而实现高性能。

但是,在内存分配器的那张图片我们知道,redis的每个k-v对初始化的内存大小是最适合的,当这个value改变的并且原来内存大小不适用的时候,就需要重新分配内存了。(但是value存比原来小不知道会不会产生碎片)。重新分配之后,就会有一部分内存redis无法正常回收,一直占用着。

----------------------------------------------------- 分割线 ------------------------------------------------

知道了原因就可以解决问题了,网上找到了两个解决方案:
1、重启redis服务,简单粗暴。
2、redis4.0以上可以使用新增指令来手动回收内存碎片,配置监控使用性能更佳,具体大家可以自己去查。

这里提个问题,如果是单机redis,想要不停服务重启redis,大家有什么好的想法?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018 物联网产业分布展望:基础设施将到位

来源&#xff1a;36氪概要&#xff1a;在过去一年多的时间里&#xff0c;关于初创企业失败以及安全问题令人担忧等报道内容一直笼罩着物联网行业。在过去一年多的时间里&#xff0c;关于初创企业失败以及安全问题令人担忧等报道内容一直笼罩着物联网行业。但其实&#xff0c;物…

深入理解C# 3.x的新特性(2):Extension Method[下篇]

四、Extension Method的本质 通过上面一节的介绍&#xff0c;我们知道了在C#中如何去定义一个Extension Method&#xff1a;它是定义在一个Static class中的、第一个Parameter标记为this关键字的Static Method。在这一节中&#xff0c;我们来进一步认识Extension Method。 和C#…

解释器模式详解

Expression.java public interface Expression {// 解析公式和数值&#xff0c;其中var 中的key 值是公式中的参数&#xff0c;value 值是具体的数字.public int interpreter(final Map<String, Integer> var); } VarExpression.java public class VarExpression imp…

二分查找(c++)

二分查找 二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;它是一种效率较高的查找方法。但是&#xff0c;折半查找要求线性表必须采用顺序存储结构&#xff0c;而且表中元素按关键字有序排列。它充分利用了元素间的次序关系&#xff0c;采用分治策略&a…

谷歌母公司投资成绩:4大机构各有侧重,投资2个马斯克项目

李杉 编译自 TechCrunch量子位 出品 | 公众号 QbitAIAlphabet&#xff0c;谷歌母公司。和谷歌做的大多数事一样&#xff0c;Alphabet也在大规模进行投资。这这篇文章中&#xff0c;外媒TechCrunch盘点了Alphabet的风险投资情况、它的投资组合的表现&#xff0c;以及该公司的投资…

Redis 数据库入门教程

From&#xff1a;http://www.jb51.net/article/56448.htm Redis 菜鸟教程&#xff1a;http://www.runoob.com/redis/redis-tutorial.html Redis 设计与实现&#xff1a;http://redisbook.com/ Redis基础、高级特性与性能调优&#xff1a;https://www.jianshu.com/p/2f14bc57…

大脑的终极秘密——从狮子也有意识谈起

作者&#xff1a;中国科学院大学教授 谢平理性思维是意识的高级成分&#xff0c;但它并非人类的专利。在自然界的生存斗争中&#xff0c;人类不仅仅需要通过感觉器官去获取外部世界的印象&#xff0c;还需要对外部世界的事物进行归类、判断与推理&#xff0c;决定自己对刺激的…

一个线程池中的线程异常了,那么线程池会怎么处理这个线程?

来源&#xff1a;一个线程池中的线程异常了&#xff0c;那么线程池会怎么处理这个线程? - 反光的小鱼儿 - 博客园 一个线程池中的线程异常了&#xff0c;那么线程池会怎么处理这个线程? 目录 线程池常用问题 不允许使用的原因测试流程 测试用例抛出堆栈异常为啥对了一半?怎…

深度学习:技术原理、迭代路径与局限

来源&#xff1a;36氪作者&#xff1a;何沛宽本文尝试复盘梳理深度学习目前的技术要点&#xff0c;深度学习中模型迭代的方向&#xff0c;以及改进后存在的局限。第一部分&#xff1a;深度学习技术基本要素&#xff1a;神经元、神经网络、分类器、可视化框架在深度学习领域&…

简单而直接的Python web 框架:web.py

From&#xff1a;https://www.oschina.net/question/5189_4306 Web.py github 地址&#xff1a;https://github.com/webpy/webpy https://pypi.python.org/pypi/web.py Web.py Cookbook 简体中文版&#xff1a;http://webpy.org/cookbook/index.zh-cn web.py 0.3 新…

从寻找可敬的人类开始,扩展未来人类生存的8个维度

来源&#xff1a;资本实验室作者&#xff1a;李鑫从小村庄到大城市&#xff0c;从国内到国外&#xff0c;从地球到月球&#xff0c;从太阳系到银河系……什么样的距离才是最远的距离&#xff1f;从地球的内部&#xff0c;到每一个原子&#xff0c;再到我们的情绪&#xff0c;哪…

开源 Python网络爬虫框架 Scrapy

开源 Python 网络爬虫框架 Scrapy&#xff1a;http://blog.csdn.net/zbyufei/article/details/7554322 介绍 所谓网络爬虫&#xff0c;就是一个在网上到处或定向抓取数据的程序&#xff0c;当然&#xff0c;这种说法不够专业&#xff0c;更专业的描述就是&#xff0c;抓取特定网…

微服务架构设计模式~为应用程序定义微服务架构

为应用程序定义微服务架构 第一步&#xff1a;定义系统操作 第二步&#xff1a;定义服务 第三步&#xff1a;定义服务API和协作方式 第一步&#xff1a;定义系统操作 第二步&#xff1a;定义服务 第三步&#xff1a;定义服务API和协作方式

用 Python 爬虫框架 Scrapy 爬取心目中的女神

From &#xff1a;http://www.cnblogs.com/wanghzh/p/5824181.html 本博文将带领你从入门到精通爬虫框架 Scrapy&#xff0c;最终具备爬取任何网页的数据的能力。 本文以校花网为例进行爬取&#xff0c;校花网&#xff1a;http://www.xiaohuar.com 让你体验爬取校花的成就感。 …

微服务架构设计模式~识别系统操作

第一步&#xff1a;创建由关键类组成的抽象领域模型&#xff0c;这些关键类提供用于描述系统操作的词汇表&#xff1b; 第二步&#xff1a;确定系统操作&#xff0c;并根据领域模型描述每个系统操作的行为 领域模型主要源自用户故事中提及的名词&#xff0c;系统操作主要来自用…

Facebook、微软、谷歌三大研究巨头齐聚首,共同探讨人工智能发展现状和趋势

作者&#xff1a; 思颖、李诗概要&#xff1a;日前 AAAS 在 reddit 上组织了一场问答&#xff0c;Facebook 人工智能研究院 Yann LeCun&#xff0c;微软研究院院长 Eric Horvitz&#xff0c;谷歌研究总监 Peter Norvig 共同出席此次活动&#xff0c;回答了观众提出的一系列问题…

《大话设计模式》Python 版代码实现

From&#xff1a;http://www.cnblogs.com/wuyuegb2312/archive/2013/04/09/3008320.html 一、简单工厂模式 模式特点&#xff1a;工厂根据条件产生不同功能的类。 程序实例&#xff1a;四则运算计算器&#xff0c;根据用户的输入产生相应的运算类&#xff0c;用这个运算类处理具…

LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络

Root 编译整理量子位 出品 | 公众号 QbitAI深度学习和人脑有什么关系&#xff1f;计算机是如何识别各种物体的&#xff1f;我们怎样构建人工大脑&#xff1f;这是深度学习入门者绕不过的几个问题。很幸运&#xff0c;这里有位大牛很乐意为你讲解。2月6日&#xff0c;UCLA&#…

微服务架构设计模式~根据业务能力进行服务拆分

业务能力定义了一个组织的工作 组织的业务能力通常是指这个组织的业务是做什么&#xff0c;它们通常是稳定的。 与之相反&#xff0c;组织采用何种方式来实现它的业务能力&#xff0c;是随着时间不断变化的。 识别业务能力 一个组织有哪些业务能力&#xff0c;是通过对组织的…

微服务架构设计模式~根据子域进行服务拆分

子域 领域驱动为每个子域定义单独的领域模型。子域是领域的一部分&#xff0c;领域是DDD中用来描述应用程序问题域的一个术语。识别子域的方式跟识别业务能力一样&#xff1a;分析业务并识别业务的不同专业领域&#xff0c;分析产出的子域定义结果也会跟业务能力非常接近。 限…