事件经过:我们在执行通过mapreduce任务往redis中加载空间索引数据的时候,当加载到一定数据量的时候,redis 执行set命令时出现延迟,由于redis是单线程执行命令,导致后面的命令会发生阻塞,数据加载了很长时间。该现象也是随机出现了两次,因此我认为是redis的问题,而不是程序问题;

本文示例中redis_version:3.0.7。

1.redis性能指标

      通过redis-cli 命令连接到redis服务器,在命令行输入info 命令可获取所有与redis服务相关的信息,为了简化分析,可以直接使用info memory命令可查看该redis端口与内存相关的数据。

各参数含义如下:

used_memory : 由 Redis 分配器分配的内存总量,单位:byte

used_memory_human : 以人类可读的格式返回 Redis 分配的内存总量

used_memory_rss : 操作系统分配给 Redis的内存总量(俗称常驻集大小)。

used_memory_peak : Redis 的内存消耗峰值,单位:byte

used_memory_peak_human : 以人类可读的格式返回 Redis 的内存消耗峰值

used_memory_lua : Lua脚本引擎所使用的内存大小

mem_fragmentation_ratio : 内存碎片率

mem_allocator : 在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。

关于redis的内存分配器,需要进一步研究研究;

2.理解内存碎片率

即由操系统分配的内存除以Redis分配的内存得出。

内存使用率是Redis服务最关键的一部分。如果一个Redis实例的内存使用率超过可用最大内存 (used_memory > used_memory_rss ),那就说明Redis实例正在进行内存交换或者已经内存交换完毕,把内存中旧的或不再使用的内容写入硬盘上(硬盘上的这块空间叫Swap分区),以便腾出新的物理内存给新页或活动页(page)使用。 在硬盘上进行读写操作要比在内存上进行读写操作,时间上慢了近5个数量级,内存是0.1μs单位、而硬盘是10ms。如果Redis进程上发生内存交换,那么Redis和依赖Redis上数据的应用会受到严重的性能影响。

如上图,6381端口的内存碎片率比较合理,6396端口的内存碎步片率比较小,就有可能进行内存交换,影响性能。

当我们调用flushdb命令释放内存时,redis自带的内存分配器可能会,也可能不会,将内存返还给操作系统,目的是为了避免操作系统低性能交换,当然它也是比较灵活的,被释放的内存块是可以被重用。这样就会产生一个问题,我们在使用多个redis实例的时候,当某一个端口使用完毕后,我们将该端口的内存释放了,但是该内存不一定会返还给操作系统,加上现在192.168.4.130环境部分端口由开发人员私有化了,缓存数据后不会清理,导致一致占用了一部分内存,此时如果某个端口正在往redis中写数据,操作系统可分配的内存不足的话,就会将一部分数据从物理内存交换到硬盘上, 内存交换会明显的增加延迟时间。

3.优化内存使用率

3.1. 尽可能的使用Hash数据结构。因为Redis在储存小于100个字段的Hash结构上,其存储效率是非常高的。所以在不需要集合(set)操作或list的push/pop操作的时候,尽可能的使用Hash结构。比如,在一个web应用程序中,需要存储一个对象表示用户信息,使用单个key表示一个用户,其每个属性存储在Hash的字段里,这样要比给每个属性单独设置一个key-value要高效的多。 通常情况下倘若有数据使用string结构,用多个key存储时,那么应该转换成单key多字段的Hash结构。 如上述例子中介绍的Hash结构应包含,单个对象的属性或者单个用户各种各样的资料。Hash结构的操作命令是HSET(key, fields, value)和HGET(key, field),使用它可以存储或从Hash中取出指定的字段。

3.2. 设置key的过期时间。一个减少内存使用率的简单方法就是,每当存储对象时确保设置key的过期时间。倘若key在明确的时间周期内使用或者旧key不大可能被使用时,就可以用Redis过期时间命令(expire,expireat, pexpire, pexpireat)去设置过期时间,这样Redis会在key过期时自动删除key。

3.3. 重启Redis服务器,如果内存碎片率超过1.5,重启Redis服务器可以让额外产生的内存碎片失效并重新作为新内存来使用,使操作系统恢复高效的内存管理。额外碎片的产生是由于Redis释放了内存块,但内存分配器并没有返回内存给操作系统。

3.4. 增加服务器可用物理内存,直接有效。

4.内存限制和key回收

      在Redis配置文件中(Redis.conf),通过设置“maxmemory”属性的值可以限制Redis最大使用的内存,修改后重启实例生效。 也可以使用客户端命令config set maxmemory 去修改值,这个命令是立即生效的,但会在重启后会失效,需要使用config rewrite命令去刷新配置文件。如果不设置maxmemory,Redis一直会为其分配内存,直至耗尽所有物理内存,直到操作系统进行虚拟内存交换。因此,一般情况下,建议还是把该值设置设上。但是对于我们robot而言,由于每个任务缓存量不同,该值的设定需要慎重。

maxmemory的单位是bytes,默认为0,即不限制最大内存。

需要注意的是,如果我们设置了maxmemory,需要指定Redis在最大内存溢出后的处理行为- maxmemory-policy,可在Redis.conf配置文件中修改“maxmemory-policy”属性值。Redis还提供了一些其他淘汰策略,如下:

Volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据;

Volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰;

Volatile-random: 从已设置过期时间的数据集合中随机挑选数据淘汰;

Allkeys-lru: 使用LRU算法从所有数据集合中淘汰数据;

Allkeys-random: 从数据集合中任意选择数据淘汰;

No-enviction:禁止淘汰数据。

通过设置maxmemory为系统可用内存的45%或95%(取决于持久化策略)和设置“maxmemory-policy”为“volatile-ttl”或“allkeys-lru”(取决于过期设置),可以比较准确的限制Redis最大内存使用率,在绝大多数场景下使用这2种方式可确保Redis不会进行内存交换。倘若你担心由于限制了内存使用率导致丢失数据的话,

可以设置noneviction值禁止淘汰数据。

Redis性能延迟分析相关推荐

  1. redis集合数据过期_关于redis性能问题分析和优化

    一.如何查看Redis性能 info命令输出的数据可以分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,comm ...

  2. 关于redis性能问题分析和优化

    一.如何查看Redis性能 info命令输出的数据可以分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,comm ...

  3. Redis 性能问题分析(好文推荐)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者: 刘思宁 整理:朱小厮 www.jianshu.com/p/ ...

  4. 硬货 | Redis 性能问题分析

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:rrd.me/gteAC 在一些网络服务的系统中,Redis ...

  5. Redis 性能问题分析

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 刘思宁 来源 | jianshu.com/p/ ...

  6. 分析内部运行机制,教你解决Redis性能问题

    摘要:聚焦Redis的性能分析,思考Redis 可以通过哪些机制来提高性能,当性能瓶颈发生的时候,我们又能做出哪些优化策略,最终确保业务系统的稳定运行. 本文分享自华为云社区<分析内部运行机制, ...

  7. redis提高oracle性能,redis性能分析与优化建议

    首先,并不是说redis是内存应用就完全没性能问题,用的不好,还是会出现各种状况,例如RDB频繁,碎片太多等. 性能分析 info信息: 在redis-cli进入登录界面后,输入info all,或者 ...

  8. redis性能分析工具redis-faina

    redis性能分析工具redis-faina redis-faina是一个通过解析redis的MONITOR命令,从而对redis实例进行性能诊断的工具. 该工具使用虽然简单,但是功能还是很不错,对于 ...

  9. Redis MGET性能衰减分析

    MGET是redis中较为常用的命令,用来批量获取给定key对应的value.因为redis使用基于RESP (REdis Serialization Protocol)协议的rpc接口,而redis ...

最新文章

  1. 两次关于软考网络工程师的经历
  2. 装备保障性验证知识图谱构建方法研究-学习笔记
  3. Cannot start compilation:the output path is not specifired for module “xxx“.Specify the output path
  4. 搭建自动安装的linux,RedHat7搭建无人值守自动安装Linux操作系统(PXE+Kickstart)
  5. ssm项目集成ftp_ssm开发旅游信息管理系统,包括前台和后台
  6. 力扣35-搜索插入位置(C++,左右闭区间,nums[mid]与target大小关系判断的不同及辨析)
  7. 插入顶部_最快速地把同一内容插入到Word文档不同页面的相同位置
  8. Python实现中英文分词
  9. 关于excel表的生成
  10. 零基础带你学习MySQL—foreign key 外键(二十六)
  11. 灯塔浮标行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  12. 杭电计算机17年复试真题详解
  13. 服务器磁盘管理 知识点
  14. tp5.1 系统常量
  15. 【WZOI】2019愚人节比赛题目分析
  16. 点击word页面自动弹出信息检索
  17. Oracle使用shutdown命令后长时间无反应
  18. 退出telnet 命令
  19. 中国椭圆形板簧行业市场供需与战略研究报告
  20. python 密码验证

热门文章

  1. 精选| 2020年5月R新包推荐(第42期)
  2. oracle批处理文件
  3. 昇腾应用营第二期-应用营-第二周-作业流程记录
  4. 永磁电机参数的测量获取(电感、电阻、极对数、磁链常数)
  5. android bugly 符号表,Bugly的符号表工具使用总结-iOS
  6. 【C】C语言大作业——学生学籍管理系统
  7. 华为c语言机试题库及答案,华为C语言机试题面试题汇总.doc
  8. u-view2.0 引入iconfont(阿里字体图标库)详细步骤!
  9. Java 使用Docx4j实现word文档Docx格式转Doc格式
  10. 图片特征提取整理(持续更新....)