我们在做性能测试的时候,经常需要观察 redis 的运行状态,因此我们得先了解它的一些我们需要观察的指标。redis 提供丰富命令来使用户更好的运作以及了解 redis,不过我觉得只要执行 redis-cli info 命令,就可以了解 redis 的一个状态了,而且指标比较全面了,下面是个人选择的几个相对重要的指标。
connected_clients:68 #连接的客户端数量
used_memory_rss_human:847.62M #系统给redis分配的内存
used_memory_peak_human:794.42M #内存使用的峰值大小
total_connections_received:619104 #服务器已接受的连接请求数量
instantaneous_ops_per_sec:1159 #服务器每秒钟执行的命令数量
instantaneous_input_kbps:55.85 #redis网络入口kps
instantaneous_output_kbps:3553.89 #redis网络出口kps
rejected_connections:0 #因为最大客户端数量限制而被拒绝的连接请求数量
expired_keys:0 #因为过期而被自动删除的数据库键数量
evicted_keys:0 #因为最大内存容量限制而被驱逐(evict)的键数量
keyspace_hits:0 #查找数据库键成功的次数
keyspace_misses:0 #查找数据库键失败的次数
我觉得在上面的指标中,2 个指标是需要着重观察的。
内存使用
如果 Redis 使用的内存超出了可用的物理内存大小,那么 Redis 很可能会被系统杀掉。针对这一点,你可以通过 info 命令对 used_memory 和 used_memory_peak 进行监控,为使用内存量设定阀值,并设定相应的报警机制。当然,报警只是手段,重要的是你得预先计划好,当内存使用量过大后,你应该做些什么,是清除一些没用的冷数据,还是把 Redis 迁移到更强大的机器上去。
QPS
即每分钟执行的命令个数,即:(total_commands_processed2-total_commands_processed1)/span,为了实时得到 QPS,可以设定脚本在后台运行,记录过去几分钟的 total_commands_processed。在计算 QPS 时,利用过去的信息和当前的信息得出 QPS 的估计值。
redis 有个很好用的功能,就是类似于 mysql 的慢日志。在出现问题的时候,方便我们查看哪里阻塞了。
Slow log 是 Redis 用来记录查询执行时间的日志系统,查询执行时间指的是不包括像客户端响应 (talking)、发送回复等 IO 操作,而单单是执行一个查询命令所耗费的时间。
另外,slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启 slow log 而损害 Redis 的速度。
设置 SLOWLOG
Slow log 的行为由两个配置参数 (configuration parameter) 指定,可以通过改写 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令对它们动态地进行修改。
第一个选项是 slowlog-log-slower-than ,它决定要对执行时间大于多少微秒 (microsecond,1 秒 = 1,000,000 微秒) 的查询进行记录。
例子 1:
执行以下命令将让 slow log 记录所有查询时间大于等于 100 微秒的查询:
CONFIG SET slowlog-log-slower-than 100
例子 2:
记录所有查询时间大于 1000 微秒的查询:
CONFIG SET slowlog-log-slower-than 1000
另一个选项是 slowlog-max-len ,它决定 slow log 最多能保存多少条日志, slow log 本身是一个 FIFO 队列,当队列大小超过 slowlog-max-len 时,最旧的一条日志将被删除,而最新的一条日志加入到 slow log,以此类推。
例子 3:
让 slow log 最多保存 1000 条日志:
CONFIG SET slowlog-max-len 1000
查看 slow log
要查看 slow log ,可以使用 SLOWLOG GET 或者 SLOWLOG GET number 命令,前者打印所有 slow log ,最大长度取决于 slowlog-max-len 选项的值,而 SLOWLOG GET number 则只打印指定数量的日志,最新的日志会最先被打印。
清空日志
使用命令 SLOWLOG RESET 可以清空 slow log。
Redis 监控最直接的方法就是使用系统提供的 info 命令,只需要执行下面一条命令,就能获得 Redis 系统的状态报告。
redis-cli info 结果会返回 Server、Clients、Memory、Persistence、Stats、Replication、CPU、Keyspace 8 个部分,从 info 大返回结果中提取相关信息,就可以达到有效监控的目的。
我就是利用这个命令结合 shell,完成一个简单的 redis 监控,最核心的语句只有一条,利用了 redis-cli info 和 shell 的管道。
/opt/redis/redis-3.2.5/bin/redis-cli -a ***** info | grep -w "connected_clients" |awk -F':' '{print $2}'
其中:grep -w 用于字符串精确匹配。
执行的结果如下:
在我自己的服务器上测试验证了下其中 2 个指标能否正确获取。
1、获取连接 redis 的客户端数目。
2、获取服务器每秒钟执行的命令数量。
当然,你可以在此脚本基础上根据自己需求做一些扩展、定制化,灵活方便,譬如把数据存储到数据库,利用一些图形化软件把数据可视化等等,这些可以让监控更加直观。最终大家可以做成如下的效果,可以实时查看。
更多性能测试相关学习可以关注公众号大话性能。更多好文章