本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告
  • 首页
  • Redis
  • Redis运维教程——Redis性能问题排查与解决

Redis运维教程——Redis性能问题排查与解决

发布:TangLu2018-9-3 11:39分类: Redis 标签: redis nosql

通过info命令查看redis服务状态的文章参见——《Redis教程(七)redis服务状态信息查看》下面说说如何通过info命令给出的数据指标对Redis性能问题进行排查与出现故障如何解决。目前已知在info命令输出数据中,memory和stats两个模块的内容对于性能有重要参考意义

一、memory模块——used_memory


redis_info1.png

used_memory_human:把Redis使用的内存总量进行了统计,包含了实际缓存占用的内存和Redis自身运行所占用的内存(如元数据、lua),但是不包含内存碎片。如果info中统计的used_memory大于了redis.conf中maxmemory所设置的可用最大内存,说明Redis实例正在进行使用swap虚拟内存,效率必然很低


used_memory_rss_human:这一项在上一项的基础上包含了内存碎片的统计

mem_fragmentation_ratio: 内存碎片率由use_memory_rss除以user_memory所得到

mem_allocator:Redis使用的内存分配器,可以是libc、jemalloc、tcmalloc。libc的性能最次。


为了避免Redis使用到swap交换内存,可以为key设置好一种合适的回收策略,只需要在redis.conf配置文件中修改maxmemory-policy的属性值。该属性的值在《Redis教程(一)——Redis 3.0.4编译安装与基本配置教程》已经有讲过。如果key都有设置TTL过期时间,那么使用volatile-ttl回收策略最合适;如果没有设置过期时间,使用allkeys-lru比较合适,它会从所有key中挑选最近最少使用的key进行删除(LRU淘汰算法)。


二、stats模块——total_commands_processed:

total_commands_processed是对Redis服务处理命令的数量进行统计,这是排查延迟问题的关键值,因为Redis是在单线程模型下工作,会把接收到的客户端命令按顺序执行,如果执行命令过多或者存在很多慢命令就会让整个队列阻塞而导致延迟由于total_commands_processed的值是递增的,所以要使用Zabbix做监控的话需要统计的是每秒的差值,这样才能知道每秒处理总数是上升还是下降,以便排查。

1、Redis中容易导致慢查询的命令主要有以下几个:

redis_info2.png

2、Redis中查询慢命令的方法:
在redis中使用slowlog get命令可以查找导致延迟的慢命令,默认会把执行时间超过10ms的命令记录到日志,也可以自己调整redis.conf中slowlog-log-slower-than一项的值

redis > slowlog get  #显示当前所有慢命令
redis > slowlog get 10  #查看最后10个慢命令
执行后的结果:


redis_info3.png

1=日志的唯一标识符

2=被记录命令的执行时间点,以 UNIX 时间戳格式表示

3=查询执行时间,以微秒为单位。例子中命令使用54毫秒

4= 执行的命令,以数组的形式排列。完整命令是config get *


三、内存碎片率——mem_fragmentation_ratio
之前介绍到used_memory_rss指标包含了内存碎片的开销,内存碎片是由系统低效的分配/回收物理内存导致的。内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低,也说明redis没有发生内存交换。但如果内存碎片率超过1.5,那就说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率,这些碎片所占用的内存代表的含义是Redis没有把内存归还给操作系统。若是内存碎片率低于1的话,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。

解决redis内存碎片问题:

1、如果内存碎片率超过1.5,重启Redis服务器可以让额外产生的内存碎片失效并重新作为新内存来使用,使操作系统恢复高效的内存管理。在重启服务之前,可以手动save一次redis数据,这样能保证在执行Redis关闭时不丢失任何数据。
2、如果内存碎片率低于1,Redis实例可能会把部分数据交换到硬盘上。内存交换会严重影响Redis的性能,所以应该增加可用物理内存或减少实Redis内存占用。
3、修改redis内存分配器。Redis支持glibc、jemalloc、tcmalloc几种不同的内存分配器,每个分配器在内存分配和碎片上都有不同的实现。通常使用redis默认的jemalloc内存分配器即可。

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!
et_highlighter51
版权所有:《Linux运维技术学习站点
文章标题:《Redis运维教程——Redis性能问题排查与解决
除非注明,文章均为 《Linux运维技术学习站点》 原创
转载请注明本文短网址:http://www.linuxe.cn/post-439.html  [生成短网址]

已有 0/1019 人参与

发表评论:

欢迎分享Linux运维技术学习站点

欢迎使用手机扫描访问本站,还可以关注微信哦~