本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告
  • 首页
  • Redis
  • 【Redis运维】Redis为什么变慢了?Redis慢日志与性能优化

【Redis运维】Redis为什么变慢了?Redis慢日志与性能优化

发布:TangLu2020-10-14 16:29分类: Redis 标签: redis nosql

redispic.png

首先分享一个Redis问题画像图,用于快速定位问题方向,然后再详细分析。比如遇到Redis响应变慢问题,对照着这张图就能发现属于Redis性能方向,然后再延续到阻塞、抖动或者是数据结构相关。根据画像图再分享一些常见的问题分析方法。


一、Redis info命令

通过info命令除了可以查看redis服务状态(参见《Redis教程(七)redis服务状态信息查看》)外还包含了一些和性能相关的指标需要关注,便于对Redis性能问题进行排查与故障解决。


1、memory模块——排查内存与碎片问题该模块输出了内存相关信息,比如Redis占用了多少内存、最大可用内存以及内存碎片率等信息

redis_info1.png

· used_memory_human:把Redis使用的内存总量进行了统计,包含了实际缓存占用的内存和Redis自身运行所占用的内存(如元数据、lua),但是不包含内存碎片

· used_memory_rss_human:这一项在上一项的基础上包含了内存碎片的统计。如果该值的统计数据大于了maxmemory所设置的值,说明Redis当前有使用swap虚拟内存,效率必然很低为了避免Redis使用到swap交换内存,建议设置好Key的过期淘汰策略。如果key都有设置TTL过期时间,使用volatile-ttl回收策略最合适;如果没有设置过期时间,使用allkeys-lru比较合适,它会从所有key中挑选最近最少使用的key进行删除(LRU淘汰算法)。

· mem_fragmentation_ratio: 内存碎片率由use_memory_rss除以user_memory所得到,内存碎片率越高,说明未回收的内存越多,意味着浪费的内存空间也就越大。通常来说内存碎片率稍大于1是合理的,如果超过1.5表Redis消耗了实际需要物理内存的150%,有50%都是碎片。若是内存碎片率低于1的话,说明Redis能申请的内存已经达不到期望值,有可能是系统内存不够用了使用了SWAP分区。如果要清理碎片的话需要对Redis进行一次重启操作,让内存碎片失效并重新作为新内存来使用。在重启服务之前可以手动save一次redis数据,这样能保证在执行Redis关闭时不丢失任何数据。修改redis内存分配器也能带来一定的优化效果。Redis支持glibc、jemalloc、tcmalloc几种不同的内存分配器,每个分配器在内存分配和碎片上都有不同的实现。通常使用redis默认的jemalloc内存分配器即可。

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

· maxmemory_human:Redis最大可使用的内存限制。虽然used_memory_human的值会受到它的限制(比如配置了maxmemory_human为2G,used_memory_human会限制在2G内),但是因为碎片问题used_memory_rss_human会突破限制。带来的直接问题就是如果maxmemory_human配置的和系统最大内存接近容易发生OOM


2、stats模块——结合慢日志排查复杂度过高的命令带来的慢查询问题

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


3、高复杂度的命令

redis_info2.png


二、Redis慢查询的设置与使用

1、设置Redis慢日志

如果在使用Redis时发现访问延迟突然增大,第一步建议检查Redis慢日志。Redis提供了慢日志命令的统计功能,只需要打开该功能就会记录符合条件的慢日志

# 命令执行超过5毫秒记录慢日志
CONFIG SET slowlog-log-slower-than 5000

# 只保留最近1000条慢日志
CONFIG SET slowlog-max-len 1000


2、查询Redis慢日志

redis > slowlog get #显示当前所有慢命令
redis > slowlog get 10  #查看最后10个慢命令



3、分析Redis慢日志

redis_info3.png

1>:该行是日志的唯一标识符

2>:该行记录命令的执行时间点,以 UNIX 时间戳格式表示

3>:该行记录命令执行耗时,以微秒为单位。例子中命令使用54毫秒

4>:该行记录执行的具体命令,以数组的形式排列。图上完整命令是config get *



4、解决慢日志带来的问题

如果业务经常使用O(n)以上复杂度的命令,例如sort、sunion、zunionstore,或者在执行O(n)命令时操作的数据量比较大,这些情况下Redis处理数据时就会很耗时。如果服务请求量并不大,但Redis实例的CPU使用率很高,很有可能是使用了复杂度高的命令导致的。解决方案就是不使用这些复杂度较高的命令,并且一次不要获取太多的数据,每次尽量操作少量的数据,让Redis可以及时处理返回。


三、其它导致性能降低的问题

1、网卡负载过高,如对一个Big key进行大量请求导致流量异常

2、Key集中过期,在删除大量Key的时候必然会产生阻塞

3、使用了swap

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

已有 0/5212 人参与

发表评论:

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

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