Redis 服务上线后,难免会出现故障需要诊断修复。
服务器日常运维需要进行健康检查,日常的健康检查可以在故障发现之前给运维管理人员提前预警,可以了解发生了什么,服务器的各项指标情况;可以使用SLOWLOG
命令来识别慢速命令或慢操作等。当产生故障时就是到了最糟糕的情况。
IFNO 健康检查
通过监控指标和统计信息来检查和识别 Redis 的检康状态,了解服务器发生了什么,正在发生什么或者什么可能是问题出现的根源。
Redis 自身提供了INFO
命令来检查和统计服务各项信息状态,info命令的详细使用可参考INFO 命令官方文档
INFO
使用 INFO 命令来获取不同维度的指标和统计数据,包括info, info stats, info clients, info persistence等项目。
#统计信息
127.0.0.1:6379> info stats
# Stats
total_connections_received:12 //接受的总连接数。若在短时间内快速增长,可能会出现 CPU 使用率过高的问题。
total_commands_processed:237893
instantaneous_ops_per_sec:0 //每秒处理的命令数
total_net_input_bytes:10995404
total_net_output_bytes:1252200
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0 //因 maxclients 的限制而拒绝的连接,该指标若增加,需注意内存使用情况。
sync_full:0 //从实例与主实例完全同步的次数
sync_partial_ok:0 //完成部分同步的次数
sync_partial_err:0 //部分同步未能完成的次数
expired_keys:2636
expired_stale_perc:0.02
expired_time_cap_reached_count:0
evicted_keys:0 //由于 maxmemory 限制而被淘汰的键的数量
keyspace_hits:76814
keyspace_misses:134328 //查找键失败,若指标态高,可考虑优化程序来降低未命中键的查询的数量
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0 //上一次fork操作耗费的时间,单位:微秒
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
#客户端
127.0.0.1:6379> info clients
# Clients
connected_clients:8
client_longest_output_list:0 //当前客户端连接中最长的输出列表。当指标的值超过 10万时,需要特别关注。
client_biggest_input_buf:0 //当前客户端连接中最大的输入缓冲区。当大小超过 10M 时,需要特别关注。
blocked_clients:0 //被一个阻塞调用(BLPOP, BRPOP, BRPOPLPUSH)挂起的客户端数量。
#持久化
127.0.0.1:6379> info persistence
# Persistence
loading:0
rdb_changes_since_last_save:157033
rdb_bgsave_in_progress:0
rdb_last_save_time:1545321601
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0 //RDB cow(copy-on-write:写时复制)重写时分配的内存
aof_enabled:1
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
aof_last_cow_size:0 //AOF cow(copy-on-write:写时复制)重写时分配的内存
aof_current_size:9618995
aof_base_size:8658372
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0
#内存
127.0.0.1:6379> info memory
# Memory
used_memory:7117376
used_memory_human:6.79M
used_memory_rss:10420224
used_memory_rss_human:9.94M
used_memory_peak:7162512
used_memory_peak_human:6.83M
used_memory_peak_perc:99.37%
used_memory_overhead:2259708
used_memory_startup:786576
used_memory_dataset:4857668
used_memory_dataset_perc:76.73%
total_system_memory:8371286016
total_system_memory_human:7.80G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:2147483648
maxmemory_human:2.00G
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.46
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
还需要关注磁盘使用情况,如果磁盘空间已满,则无法保存 RDB 文件和 AOF 追求数据。
redis-cli --stat
使用 redis-cli --stat
来持续监控 Redis 的基本统计数据
实时地输出基本的服务器指标,可以对内存使用情况、连接的客户端等有一个大致的了解。默认每秒种打印一次;也可使用 -i <interval>
来指定输出间隔时间。
[root@192 6379]# ./redis-cli -a 123456 --stat
Warning: Using a password with '-a' option on the command line interface may not be safe.
------- data ------ --------------------- load -------------------- - child -
keys mem clients blocked requests connections
26084 6.79M 8 0 239132 (+0) 17
26085 6.79M 8 0 239138 (+6) 17
SLOWLOG 慢速日志
Redis 提供了 SLOWLOG 功能来识别慢速命令或慢操作。
Redis Slow Log是一个记录超过指定执行时间的查询的系统。 执行时间不包括I/O操作,如与客户端交互,发送回复等等,而只是实际执行命令所需的时间(这是命令执行的唯一阶段,其中线程被阻止并且可以在此期间不提供其他请求)。
因此,可能在应用端发现延迟增加甚至超时,但在 Reids 慢日志中却找不到记录,这可能是其它诸如网络延迟增加等因素造成的。
在 Redis 配置文件 redis.conf 中,有两个参数可配置慢速命令日志;
slowlog-log-slower-than 10000
设置命令执行时间,以微秒为单位,以便记录命令;默认是值是 10000(10 毫秒);1000000 相当于 1 秒。负数会禁用慢速命令日志,值为零则会强制记录每个命令。slowlog-max-len 128
记录慢速命令的最大数量,慢速命令记录被压入一个先进先出的队列,该配置相当于队列的大小,默认 128。记录新命令时,将从记录的命令队列中删除最旧的命令。或在服务器运行时可通过 CONFIG 和CONFIG SET命令来完成。
127.0.0.1:6379> config set slowlog-log-slower-than 10000 OK
获取所有慢日志或获取指定条数的慢日志
127.0.0.1:6379> slowlog get 3 1) 1) (integer) 9 //慢日志记录唯一标识 2) (integer) 1545495881 //所记录命令被处理时的 unix 时间戳 3) (integer) 9 //执行命令所需的时间,单位:微秒 4) 1) "hmset" //命令和参数组成的数组 2) "new_hash" 3) "aa" 4) "bb" 5) "cc" 6) "dd" 7) "ee" 8) "ff" 5) "127.0.0.1:60552" //客户端IP和端口(4.0新增) 6) "" //客户端名称,如果有通过 CLIENT SETNAME 设置客户端的名称(4.0新增) 2) 1) (integer) 8 2) (integer) 1545495863 3) (integer) 23 4) 1) "keys" 2) "*" 5) "127.0.0.1:60552" 6) "" 3) 1) (integer) 7 2) (integer) 1545495850 3) (integer) 6 4) 1) "set" 2) "foo" 3) "bar" 5) "127.0.0.1:60552" 6) "" 127.0.0.1:6379> slowlog get 3 //获取最近的3条
每一条慢日志记录由六个字段组成(4.0之前的版本是四个字段。)
获取慢日志的数量
127.0.0.1:6379> slowlog len (integer) 6
清除所有记录
127.0.0.1:6379> slowlog reset OK 127.0.0.1:6379> slowlog len (integer) 0
慢日志只记录在内存中,且不会持久化,因此慢日志机制的速度非常快。
相关参考
注意:本文归作者所有,未经作者允许,不得转载