最新消息:网站迁移至香港,数据恢复中。

Redis监控汇总

IT技术 ipcpu 106浏览

Redis监控汇总.md

一、概述

对于任何运行在生产环境的软件,监控都是必不可少的一个环节。

我们在分析各种工具之前,先来看下redis都有哪些指标需要关注和监控。

Redis监控的用途有两种,一种是类似于zabbix,监控指标并用来报警,另外一种就是出现问题时,快速定位问题使用的。

各个数据库db的key数量、redis存储的key总数量
redis内存使用状况
redis使用CPU状况
redis当前的QPS
redis中数据请求的命中率
key的过期和逐出情况
当前redis的客户端情况
Redis网络出入带宽
redis客户端发起的命令排行(TOP 10 命令)
主从、RDB和AOF持久化及其他

redis自带了redis-cli工具,基本上可以覆盖以上一些指标,但是有很多指标需要经过进一步处理才可以显示。我们后面会逐个分析。

二、redis-cli命令

redis-cli是redis自带的客户端工具,可以执行丰富的redis命令,当然也提供了很多的监控数据。

2.1 info命令

info命令是redis最基本的监控数据

[[email protected] ~]# redis-cli info
# Server
redis_version:3.2.8
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:d3e3dd6ceee8d380
redis_mode:standalone
os:Linux 2.6.32-573.22.1.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:6048
run_id:6971ef604fa47e0d243993e31e376175eab35583
tcp_port:6379
uptime_in_seconds:3732962
uptime_in_days:43
hz:10
lru_clock:10546323
executable:/usr/bin/redis-server
config_file:/etc/redis.conf

# Clients
##@@客户端情况
connected_clients:71
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
##@@当前redis占用的内存,也显示了maxmemory和maxmemory_policy参数的值。
used_memory:13085437256
used_memory_human:12.19G
used_memory_rss:13872644096
used_memory_rss_human:12.92G
used_memory_peak:13085903160
used_memory_peak_human:12.19G
total_system_memory:16726142976
total_system_memory_human:15.58G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:13500000000
maxmemory_human:12.57G
maxmemory_policy:volatile-lru
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-4.0.3

# Persistence
##持久化相关内容
loading:0
rdb_changes_since_last_save:220962
rdb_bgsave_in_progress:1
rdb_last_save_time:1520495145
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:115
rdb_current_bgsave_time_sec:17
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

# Stats
total_connections_received:882320
total_commands_processed:2796368475
instantaneous_ops_per_sec:820   #QPS
total_net_input_bytes:206269274267
total_net_output_bytes:221172814051
instantaneous_input_kbps:56.02    #带宽数据
instantaneous_output_kbps:25.40
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:209363123
evicted_keys:79500926
keyspace_hits:722384216
keyspace_misses:128646755
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:194435
migrate_cached_sockets:0

# Replication
##@@主从相关内容
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
##@@CPU状态,这个值需要进行计算后才能得出CPU利用率。
used_cpu_sys:89819.95
used_cpu_user:45773.93
used_cpu_sys_children:19337.14
used_cpu_user_children:514401.09

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=13678267,expires=10984098,avg_ttl=550750775
##@@这里显示了各个数据库key的存放数目,也可以通过select db后,dbsize计算当前db中key的数量。

info命令只是总体显示了一些监控数据,redis-cli还有其他监控项目,比如

2.2 查看和杀掉客户端连接

##@@列出客户端
127.0.0.1:6379> CLIENT LIST
id=881455 addr=172.28.0.87:36377 fd=12 name= age=4882 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=del
id=881976 addr=172.28.0.95:42077 fd=35 name= age=2334 idle=9 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=setnx
id=881899 addr=172.28.0.95:40057 fd=38 name= age=2729 idle=6 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
##@@杀掉客户端(不实用,自己一会儿就连上了)
127.0.0.1:6379> CLIENT KILL 172.28.0.95:40057

2.3 stat命令

此命令可以显示key数量、内存、客户端数量、QPS情况,类似于iostat、vmstat之类每秒钟刷新一次,如下

[[email protected] fio]# redis-cli -h 127.0.0.1 -p 6379 --stat 
------- data ------ --------------------- load -------------------- - child -
keys      mem      clients blocked requests            connections          
12495867  11.93G  57      0      2774586381 (+0)    878430      
12495972  11.93G  57      0      2774587430 (+1049)  878430      
12496038  11.93G  57      0      2774588265 (+835)  878430      
12496149  11.93G  57      0      2774589330 (+1065)  878430      
12496225  11.93G  57      0      2774590345 (+1015)  878430      
12496326  11.93G  57      0      2774591469 (+1124)  878430      
12496428  11.93G  57      0      2774592548 (+1079)  878430      

如果你的redis设置了密码,需要加上参数”-a yourpassword”。

2.4 查看redis延迟

–latency, –latency-history 参数可以参看redis当前的响应延迟情况。

[[email protected] ~]# redis-cli -h 127.0.0.1 -p 6379 --latency
min: 7, max: 1230, avg: 66.22 (89 samples)

2.5 使用monitor开启实时监控

monitor命令会监控当前redis接受的命令和数据内容,这个命令会比较消耗资源,根据官网的测试,QPS会下降到原先的50%,需要谨慎使用。

[[email protected] ~]# redis-cli monitor
OK
1520496864.844638 [0 172.28.0.95:40594] "SETNX" "CSCustomer_5ad69f0b068f278e01c2ef5f701ec5a5" "1"
1520496864.845212 [0 172.28.0.27:10706] "GET" "lock_:4211022454185883_20003"
1520496864.846564 [0 172.28.0.27:10706] "DEL" "lock_:4211022454185883_20003"

我们可以将 redis-cli monitor数据写入到文件,然后就可以手动分析命令执行的次数。

[[email protected] ~]# cat m.log |awk '{print $4}' |sort |uniq -c |sort -nr
  3523 "SETNX"
  1488 "GET"
  1253 "SADD"
  1142 "PING"

2.6 使用bigkeys查找占用空间较大的key

–bigkeys这条命令会使用SCAN从redis里面查找占用空间最大的key,这会遍历redis数据库。
但是他只把最大的找出来了,不怎么实用,至少来个TOP10吧。

[[email protected] ~]# redis-cli --bigkeys

# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Biggest string found so far 'priv_key_78410' with 1 bytes
[00.09%] Biggest string found so far 'bigkey' with 573 bytes
[50.22%] Biggest string found so far 'bigkey2' with 606 bytes

-------- summary -------

Sampled 81697 keys in the keyspace!
Total key length in bytes is 1133020 (avg len 13.87)

Biggest string found 'bigkey2' has 606 bytes

81697 strings with 83563 bytes (100.00% of keys, avg size 1.02)
0 lists with 0 items (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)

好了,说完系统自带的,我们来看看开源redis监控都有哪些吧

首先推荐的是Facebook家的小工具,redis-faina

三、redis-faina

redis-faina是一个通过解析redis的MONITOR命令,从而对redis实例进行性能诊断的工具。python编写,只有一个文件,短小精悍。比较实用,是一款排错时使用的良品。使用方法如下:

$ redis-cli -p 6379 MONITOR > m.log
$ ./redis-faina.py ./m.log

命令输出如下

[[email protected] ~]# cat m.log |./redis-faina.py 
Overall Stats    
========================================
Lines Processed      10824        ##@@处理的数据条数
Commands/Sec        943.17      ##@@QPS

Top Prefixes    ##@@前缀最多的数据
========================================
lock_      998    (9.22%)

Top Keys        ##@@访问次数最多的key
========================================
lock_:ACCESS_LIMIT                                  591    (5.46%)
ACCESS_COUNT                                        120    (1.11%)
activeValue_201802                                  50    (0.46%)
Widget_Filter_7ad45c1f3798c3e785e442f8fa243d00      42    (0.39%)
Widget_Filter_10d14b3b04883ecfd10a8444319cf9d3      26    (0.24%)
Widget_Filter_7c2b71218180c309f6dc59f55a08b5e9      22    (0.20%)
Widget_Filter_a8ab1c0edeece7b32694bec2b7b22afc      18    (0.17%)
push_pctype_RESCUER R720-15IKBN                    18    (0.17%)

Top Commands    ##@@使用的最多的命令
========================================
SETNX        3523    (32.55%)
GET          1488    (13.75%)
SADD          1253    (11.58%)
PING          1142    (10.55%)
PEXPIRE      878    (8.11%)
SMEMBERS      654    (6.04%)
SETEX        415    (3.83%)
SREM          406    (3.75%)

Command Time (microsecs)  ##@@请求的响应时间分布
========================================
Median      661.75
75%        1353.0
90%        2485.25
99%        6192.0

Heaviest Commands (microsecs)  ##@@总体耗时最多的命令
========================================
SETNX        4366803.25
PING          1799698.5
GET          1507729.75
SADD          1055130.25
PEXPIRE      791175.0
SMEMBERS      594467.5
SETEX        460230.25
SREM          294952.5

Slowest Calls   ##@@慢请求列表
========================================
10216.0      "PING"
10212.25      "PING"
10209.75      "PING"
10205.0      "PING"
10202.25      "PING"
10201.75      "PING"
10200.75      "PING"
10188.0      "PING"

接下来,我们看两个比较流行但是华而不实的产品。

四、Redis-stat

这是一个ruby编写的软件,作者也提供了java封装版本。它可以实时查看redis服务器的CPU占用、内存占用、QPS、KEY数量、命中率情况、KEY过期和逐出情况。同时该软件可以监听HTTP端口,提供页面服务。命令行使用方法和效果截图如下:

java -jar redis-stat-0.4.14.jar   

部分指标说明:
cl 连接客户端数量,bcl 阻塞客户端数量(如BLPOP),exp/s 每秒过期key数量,evt/s 每秒淘汰key数量,aofcs AOF日志当前大小

我们看到,此款软件功能上与redis-cli –stat 类似,监控项目也更加全面,但是不如系统自动的工具来得快。

五、RedisLive

RedisLive是由python编写的并且开源的图形化监控工具,非常轻量级,核心服务部分只包含一个web服务和一个基于redis自带的info命令以及monitor命令的监控服务。

除了图形化,没有比的优势,并且monitor命令很耗资源,不宜长期开启。

除了与redis-stat类似的监控指标外,还有top command和top keys的图表。但是安装比较复杂。

六、总结

看了一圈redis的监控方案,是不是觉着没有一款万能的产品,开源软件就是这样。

如果为了zabbix监控,建议使用python或者shell编写脚本,使用redis-cli来获取各种数据。

如果是为了排查问题,monitor+redis-faina 是个不错的选择。

参考资料

http://www.zmonster.me/2015/12/16/redis-performance-analysis.html
https://github.com/facebookarchive/redis-faina
https://github.com/junegunn/redis-stat
http://blog.csdn.net/cjfeii/article/details/77069778
https://www.objectrocket.com/blog/how-to/top-10-redis-cli-commands
https://juejin.im/entry/57c673912e958a006990f6e9

转载请注明:IPCPU--网络之路 » Redis监控汇总