最近遇到了系统登录、加载等特慢的问题
经过排查大致锁定了是redis查询慢的问题
于是对redis性能进行了排查
首先在可连接redis服务器的机器上,(前提是有redis-cli工具)使用命令
redis-cli -h xxx.xxx.xxx.xxx(或者域名) -p 6379 -a xxx(认证密码) --latency
测试redis延迟,一般来说avg小于0.3可视为正常
redis-cli -h xxx.xxx.xxx.xxx(或者域名) -p 6379 -a xxx(认证密码)
进入redis连接,使用info memory命令查询内存使用情况
当 rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。
内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。
当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。
上面步骤下来看到redis应该也挺正常的,那系统为什么卡呢,继续执行下面的命令
slowlog get 20
获取最近20条执行慢的查询
可配置慢查询阈值,超过该时间的查询视为慢查询并记录
CONFIG SET slowlog-log-slower-than 10000
默认slowlog-log-slower-than值为10000微秒=10ms
查询结果如下:
好家伙,结果发现这么多通过通配符查询token的命令,赶紧去代码里全局搜了一遍,结果发现代码里有个通过用户ID获取token的方法,写的是先通配符获取所有token,然后通过key取里面的userid与自身进行对比。并且该方法使用的地方也不少。
用膝盖想就知道性能极差,于是便对方法进行了优化,尽量减少这种情况的调用,解决后重新测试果然快了不少。