redis-faina是一款非常好用的redis性能诊断工具,如果你的redis server遇到性能问题,比如cpu非常高,那么可以使用redis-faina来分析问题原因。
redis-faina 是由Instagram 开发并开源的一个Redis 查询分析小工具,GitHub地址: https://github.com/facebookarchive/redis-faina。
它是通过Redis的MONITOR命令来实现的,通过对在Redis上执行的query进行监控,统计出一段时间的query特性,这个工具是用Python开发的,意味着我们可以很容易的对它进行修改
为什么极力推荐redis-faina,因为我们线上多次redis cpu非常高的问题都是靠它分析诊断的
先来看下它的使用方法:
redis-faina.py --help
usage: redis-faina.py [-h] [--prefix-delimiter PREFIX_DELIMITER]
[--redis-version REDIS_VERSION]
[input]
positional arguments:
input File to parse; will read from stdin otherwise
optional arguments:
-h, --help show this help message and exit
--prefix-delimiter PREFIX_DELIMITER
String to split on for delimiting prefix and rest of
key
--redis-version REDIS_VERSION
Version of the redis server being monitored
再来看下它的输出:
redis-cli -h 192.168.1.111 -p 6302 -a redis_password monitor|head -10000|redis-faina.py --redis-version=2.8
Overall Stats
========================================
Lines Processed 80000 ##总的处理命令数
Commands/Sec 19940.07 #qps
Top Prefixes #前缀最多的数据,默认使用:作为前缀,可以使用参数 --prefix-delimiter aaa 来调整
========================================
__sentinel__ 5 (0.01%)
Top Keys #访问最多的对象
========================================
Dredis_ID_ZSET_1_1176054 4861 (6.08%)
Dredis_ID_ZSET_1_160 4811 (6.01%)
online--client--Rpc_Service_Method 3357 (4.20%)
Dredis_ID_ZSET_1_101009 2045 (2.56%)
Dredis_ID_ZSET_1_334109063 1781 (2.23%)
Dredis_ID_ZSET_1_336511050 1697 (2.12%)
Dredis_ID_ZSET_1_5811013 1579 (1.97%)
Dredis_ID_ZSET_1_203 1539 (1.92%)
Top Commands #操作最多的命令
========================================
EXISTS 36245 (45.31%)
ZRANK 31308 (39.13%)
GET 5616 (7.02%)
EXPIRE 2048 (2.56%)
INCR 1196 (1.49%)
RPUSH 664 (0.83%)
ZADD 647 (0.81%)
ZREVRANGE 458 (0.57%)
Command Time (microsecs) #响应时间分布
========================================
Median 24.25
75% 39.0
90% 90.0
99% 463.0
Heaviest Commands (microsecs) #总体耗时最长的命令
========================================
EXISTS 1445269.75
ZRANK 1127109.75
GET 767743.0
EXPIRE 200610.0
INCR 157524.5
ZRANGEBYSCORE 74118.25
ZCOUNT 56930.0
ZADD 29975.75
Slowest Calls #最慢的几个操作
========================================
2164.0 "GET" "__redis__join_8-3060024150"
2150.75 "GET" "__redis__join_8-3047955946"
1950.0 "ZRANK" "Dredis_ID_ZSET_1_3385004" "788237518"
1936.25 "INCR" "439635ad787cb069213ff502a17505bc"
1855.25 "GET" "__redis__join_8-3098250013"
1819.0 "ZRANGEBYSCORE" "Likedredis__129164011" "1.466515899404E12" "9.223372036854776E18" "limit" "0" "2147483647" ...
1777.25 "GET" "__redis__join_8-3058403444"
1766.0 "EXPIRE" "000b05d09e9ae9d4a451a29a369d644e" "60"
可以看到redis-faina的使用非常简单,结果输出非常详细,并且简单易懂。上面输出是某产品最近一次CPU利用率非常高时的一个报告,通过这份输出报告可以很明显的看到,是因为大量ZSet操作引起的问题。
我们这边业务通常连的都是一个redis集群(sentinel, redis cluster, ncr),开发同学要自己排查CPU高问题怎么做呢?
1.找到哨兵监控(建议通过 http://owl.hz.netease.com/main/#!/redis 管理自己的redis集群)
2.找到集群中cpu较高的redis实例,对该实例使用redis-faina收集诊断信息
切记“monitor|head -10000”这里不宜太大,否则可能造成一定cpu消耗,一般收集个2-3s差不多,比如qps是10000 那么head -20000比较合理
支持下我同事写的干货文章!
作者:杜明友
如果你看到这里,别忘了点赞转发收藏!还有关注我噢~
你的支持是我更新的动力