在使用 Redis 时,时常会遇到很多问题需要诊断,在诊断之前需要了解 Redis 的运行状态,通过强大的 Info 指令,你可以清晰地知道 Redis 内部一系列运行参数。
Info 指令显示的信息非常繁多,分为 9 大块,每个块都有非常多的参数,这 9 个块分别是:
- Server 服务器运行的环境参数
- Clients 客户端相关信息
- Memory 服务器运行内存统计数据
- Persistence 持久化信息
- Stats 通用统计数据
- Replication 主从复制相关信息
- CPU CPU 使用情况
- Cluster 集群信息
- KeySpace 键值对统计数量信息
Info 可以一次性获取所有的信息,也可以按块取信息。详情可以参考redis官方文档
# 获取所有信息
> info
# Server
...
# Clients
...
# Memory
...
# Persistence
...
# Stats
...
# Replication
...
# CPU
...
# Cluster
...
# Keyspace
...
# 获取内存相关信息
> info memory
# Memory
used_memory:889376
used_memory_human:868.53K
used_memory_rss:4083712
...
# 获取复制相关信息
> info replication
# Replication
role:master
connected_slaves:0
master_replid:0e4b9992edc630942127f4f3707dd9fb9064a7e0
...
Redis 每秒执行多少次指令?
这个信息在stats块中,可以使用info status
查看。
> info stats
# Stats
total_connections_received:8
total_commands_processed:29
# ops_per_sec: operations per second,也就是每秒操作数
instantaneous_ops_per_sec:10
#表示因为超出最大连接数限制而被拒绝的客户端连接次数,
#如果这个数字很大,意味着服务器的最大连接数设置的过低需要调整 maxclients 参数。
rejected_connections:0
#以下内容省略
...
如果想实时监测redis运行了哪些命令,可以使用monitor命令
> monitor
OK
在另一个客户端中运行keys *
,可以看到以下信息:
> monitor
OK
1539355497.644954 [0 127.0.0.1:51082] "keys" "*"
Redis 连接了多少客户端?
这个信息在 Clients 块里,可以通过 info clients
看到。
> info clients
# Clients
connected_clients:124 # 这个就是正在连接的客户端数量
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
如果想知道客户端链接来源,可以使用client list
查看。
> client list
id=7 addr=127.0.0.1:50938 fd=9 name= age=4515 idle=305 flags=O db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=monitor
id=9 addr=127.0.0.1:51082 fd=8 name= age=4176 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
id=10 addr=127.0.0.1:51086 fd=10 name= age=4148 idle=3893 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info
Redis 内存占用多大 ?
这个信息在 Memory 块里,可以通过 info memory 看到。
> info memory
used_memory_human:827.46K # 内存分配器 (jemalloc) 从操作系统分配的内存总量
used_memory_rss_human:3.61M # 操作系统看到的内存占用 ,top 命令看到的内存
used_memory_peak_human:829.41K # Redis 内存消耗的峰值
used_memory_lua_human:37.00K # lua 脚本引擎占用的内存大小
...
复制积压缓冲区多大?
这个信息在 Replication 块里,可以通过 info replication 看到。
> info replication
repl_backlog_active:0
repl_backlog_size:1048576 # 这个就是积压缓冲区大小
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
...
复制积压缓冲区大小非常重要,它严重影响到主从复制的效率。当从库因为网络原因临时断开了主库的复制,然后网络恢复了,又重新连上的时候,这段断开的时间内发生在 master 上的修改操作指令都会放在积压缓冲区中,这样从库可以通过积压缓冲区恢复中断的主从同步过程。
积压缓冲区是环形的,后来的指令会覆盖掉前面的内容。如果从库断开的时间过长,或者缓冲区的大小设置的太小,都会导致从库无法快速恢复中断的主从同步过程,因为中间的修改指令被覆盖掉了。这时候从库就会进行全量同步模式,非常耗费 CPU 和网络资源。
如果有多个从库复制,积压缓冲区是共享的,它不会因为从库过多而线性增长。如果实例的修改指令请求很频繁,那就把积压缓冲区调大一些,几十个 M 大小差不多了,如果很闲,那就设置为几个 M。
> redis-cli info stats | grep sync
sync_full:0
sync_partial_ok:0
sync_partial_err:0 # 半同步失败次数
通过查看sync_partial_err变量的次数来决定是否需要扩大积压缓冲区,它表示主从半同步复制失败的次数。