Author:skatexg
Time:2020/11/20
redis-faina 是由Instagram 开发并开源的一个Redis 查询分析小工具,redis-faina 是通过Redis的MONITOR命令来实现的,通过对在Redis上执行的query进行监控,统计出一段时间的query特性
1.安装
# git clone https://github.com/facebookarchive/redis-faina.git
查看目录结构如下:
# ll
total 20
-rwxr-xr-x 1 root root 1781 Nov 19 15:53 heroku-redistogo-faina.sh
-rw-r--r-- 1 root root 1285 Nov 19 15:53 LICENSE
-rw-r--r-- 1 root root 3267 Nov 19 15:53 README.md
-rwxr-xr-x 1 root root 6568 Nov 19 15:53 redis-faina.py
# ./redis-faina.py -h
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
2.redis-faina的命令
A.通过管道从stdin读取N条命令分析处理
# redis-cli -h xx.xx.xx.xx -p 6379 -a pwd monitor | head -n | redis-faina.py --prefix-delimiter 前缀字符串
B.直接从文件里读取N条命令分析处理
# redis-cli -h xx.xx.xx.xx -p 6379 -a pwd monitor | head -n > /tmp/outfile.txt
# redis-faina.py /tmp/outfile.txt
样例:
# ../redis-4.0.14/src/redis-cli -h xxxxxxxx.redis.rds.aliyuncs.com -p 6379 -a password monitor | head -n 500 | ./redis-faina.py
Warning: Using a password with '-a' option on the command line interface may not be safe.
Overall Stats
========================================
Lines Processed 500 --总命令数
Commands/Sec 8605.30 --qps
Top Prefixes --前缀最多的数据
========================================
app 221 (44.20%)
oauth2 66 (13.20%)
account 37 (7.40%)
spring 5 (1.00%)
Top Keys -- 使用最多的key
========================================
app:client-subscriptions:06f116682dzPyhnuHw1 21 (4.20%) -- 具体key 请求数量 占比
app:client-detail06f11668RQI1U2dzPyhnuHw1 20 (4.00%)
app:client-subscriptions06f11668N8z3QwRBpI0kf 15 (3.00%)
app:client-detail:06f11668z3QwRBpI0kf 14 (2.80%)
app:client-subscriptions:06f11668r4qVTD6sgIw6 11 (2.20%)
app:client-subscriptions:06f11668snh6vjhjCro5gH 10 (2.00%)
app:client-detail:06f116684qVTD6sgIw6 10 (2.00%)
app:client-subscriptions:06f1166895634f70a8c71917 10 (2.00%)
Top Commands -- 使用的最多的命令
========================================
PING 169 (33.80%)
EXISTS 143 (28.60%)
GET 121 (24.20%)
HGET 28 (5.60%)
TTL 14 (2.80%)
TYPE 14 (2.80%)
SETEX 6 (1.20%)
info 1 (0.20%)
Command Time (microsecs) -- 请求的响应时间分布
========================================
Median 81.25
75% 161.0
90% 262.25
99% 577.0
Heaviest Commands (microsecs) -- 总体耗时最多的命令
========================================
EXISTS 17417.5
PING 17403.5
GET 15763.0
HGET 3270.5
TTL 1663.5
TYPE 1166.75
SETEX 597.25
info 344.0
Slowest Calls -- 慢请求列表
========================================
1408.0 "GET" "app:client-subscriptions:06f11668r4qVTD6sgIw6"
814.0 "GET" "oauth2:authentication:06f11668e830919bedc"
601.0 "PING"
588.75 "PING"
577.0 "PING"
554.0 "PING"
546.0 "EXISTS" "app:client-detail:06f11668SN8z3QwRBpI0kf"
460.0 "EXISTS" "app:client-detail:06f11668UAm8Mozr"
说明:
由于redis MONITOR输出的只有请求开始的时间,所以在一个非常繁忙的redis实例中,根据该请求的开始时间以及下一个请求的开始时间,可以大概估算出一个请求的执行时间。由此可以看出,
redis-faina统计的时间并不是十分精确的,尤其在分析一个非常闲的redis实例时,分析的结果可能差的很多
3.使用场景
1.当redis遇到性能问题时,可以用redis-faina做个在线的快照,可以在线诊断redis问题,相比分析redis全内存数据,更快更方便
2.以后把这个小工具集成到运维平台,用户使用更方便
--end---