存活情况
所有指标中最重要的当然是检查 Redis 是否还活着, 可以通过命令 PING 的响应是否是 PONG 来判断.
连接数
连接的客户端数量, 可通过命令 src/Redis-cli info Clients | grep connected_clients 得到, 这个值跟使用 Redis 的服务的连接池配置关系比较大, 所以在监控这个字段的值时需要注意. 另外这个值也不能太大, 建议不要超过 5000, 如果太大可能是 Redis 处理太慢, 那么需要排除问题找出原因.
另外还有一个拒绝连接数 (rejected_connections) 也需要关注, 这个值理想状态是 0. 如果大于 0, 说明创建的连接数超过了 maxclients, 需要排查原因. 是 Redis 连接池配置不合理还是连接这个 Redis 实例的服务过多等.
阻塞客户端数量
blocked_clients, 一般是执行了 list 数据类型的 BLPOP 或者 BRPOP 命令引起的, 可通过命令 src/Redis-cli info Clients | grep blocked_clients 得到, 很明显, 这个值最好应该为 0.
使用内存峰值
监控 Redis 使用内存的峰值, 我们都知道 Redis 可以通过命令 config set maxmemory 10737418240 设置允许使用的最大内存(强烈建议不要超过 20G), 为了防止发生 swap 导致 Redis 性能骤降, 甚至由于使用内存超标导致被系统 kill, 建议 used_memory_peak 的值与 maxmemory 的值有个安全区间, 例如 1G, 那么 used_memory_peak 的值不能超过 9663676416(9G). 另外, 我们还可以监控 maxmemory 不能少于多少 G, 比如 5G. 因为我们以前生产环境出过这样的问题, 运维不小心把 10G 配置成了 1G, 从而导致服务器有足够内存却不能使用的悲剧.
内存碎片率
mem_fragmentation_ratio=used_memory_rss/used_memory, 这也是一个非常需要关心的指标. 如果是 redis4.0 之前的版本, 这个问题除了重启也没什么很好的优化办法. 而 redis4.0 有一个主要特性就是优化内存碎片率问题(Memory de-fragmentation). 在 Redis.conf 配置文件中有介绍即 ACTIVE DEFRAGMENTATION: 碎片整理允许 Redis 压缩内存空间, 从而回收内存. 这个特性默认是关闭的, 可以通过命令 CONFIG SET activedefrag yes 热启动这个特性.
当这个值大于 1 时, 表示分配的内存超过实际使用的内存, 数值越大, 碎片率越严重.
当这个值小于 1 时, 表示发生了 swap, 即可用内存不够.
另外需要注意的是, 当内存使用量 (used_memory) 很小的时候, 这个值参考价值不大. 所以, 建议 used_memory 至少 1G 以上才考虑对内存碎片率进行监控.
缓存命中率
keyspace_misses/keyspace_hits 这两个指标用来统计缓存的命令率, keyspace_misses 指未命中次数, keyspace_hits 表示命中次数. keyspace_hits/(keyspace_hits+keyspace_misses)就是缓存命中率. 视情况而定, 建议 0.9 以上, 即缓存命中率要超过 90%. 如果缓存命中率过低, 那么要排查对缓存的用法是否有问题!
OPS
instantaneous_ops_per_sec 这个指标表示缓存的 OPS, 如果业务比较平稳, 那么这个值也不会波动很大, 不过国内的业务比较特性, 如果不是全球化的产品, 夜间是基本上没有什么访问量的, 所以这个字段的监控要结合自己的具体业务, 不同时间段波动范围可能有所不同.
持久化
rdb_last_bgsave_status/aof_last_bgrewrite_status, 即最近一次或者说最后一次 RDB/AOF 持久化是否有问题, 这两个值都应该是 "ok".
另外, 由于 Redis 持久化时会 fork 子进程, 且 fork 是一个完全阻塞的过程, 所以可以监控 fork 耗时即 latest_fork_usec, 单位是微妙, 如果这个值比较大会影响业务, 甚至出现 timeout.
失效 KEY
如果把 Redis 当缓存使用, 那么建议所有的 key 都设置了 expire 属性, 通过命令 src/Redis-cli info Keyspace 得到每个 db 中 key 的数量和设置了 expire 属性的 key 的属性, 且 expires 需要等于 keys:
- # Keyspace
- db0:keys=30,expires=30,avg_ttl=0
- db0:keys=23,expires=22,avg_ttl=0
慢日志
通过命令 slowlog get 得到 Redis 执行的 slowlog 集合, 理想情况下, slowlog 集合应该为空, 即没有任何慢日志, 不过, 有时候由于网络波动等原因造成 set key value 这种命令执行也需要几毫秒, 在监控的时候我们需要注意, 而不能看到 slowlog 就想着去优化, 简单的 set/get 可能也会出现在 slowlog 中.
要查看 slow log , 可以使用 SLOWLOG GET 或者 SLOWLOG GET number 命令, 前者打印所有 slow log , 最大长度取决于 slowlog-max-len 选项的值, 而 SLOWLOG GET number 则只打印指定数量的日志.
- Redis> SLOWLOG GET
- 1) 1) (integer) 12 # 唯一性 (unique) 的日志标识符
- 2) (integer) 1324097834 # 被记录命令的执行时间点, 以 UNIX 时间戳格式表示
- 3) (integer) 16 # 查询执行时间, 以微秒为单位
- 4) 1) "CONFIG" # 执行的命令, 以数组的形式排列
- 2) "GET" # 这里完整的命令是 CONFIG GET slowlog-log-slower-than
- 3) "slowlog-log-slower-than"
- 2) 1) (integer) 11
- 2) (integer) 1324097825
- 3) (integer) 42
- 4) 1) "CONFIG"
- 2) "GET"
- 3) "*"
- 3) 1) (integer) 10
- 2) (integer) 1324097820
- 3) (integer) 11
- 4) 1) "CONFIG"
- 2) "GET"
- 3) "slowlog-log-slower-than"
- ...
来源: http://www.tuicool.com/articles/2MreEbr