INFO commandstats 是「每个命令被调用了多少次、花了多少时间」的账本。它精确吗?各字段是什么意思?failed 和 rejected 有什么区别?它的耗时和客户端看到的一样吗?这篇用已知次数的命令逐项核对。
cmdstat_set calls=1000,usec=491,usec_per_call=0.49,rejected_calls=0,failed_calls=0 cmdstat_get calls=3000,usec=601,usec_per_call=0.20,rejected_calls=0,failed_calls=0 cmdstat_incr calls=500,usec=131,usec_per_call=0.26,rejected_calls=0,failed_calls=0 cmdstat_keys calls=20,usec=482,usec_per_call=24.10,rejected_calls=0,failed_calls=0 cmdstat_hget calls=10,usec=8,usec_per_call=0.80,rejected_calls=0,failed_calls=10 cmdstat_eval calls=5,usec=24,usec_per_call=4.80,rejected_calls=0,failed_calls=0
每个命令一行:calls(次数)、usec(累计执行微秒)、usec_per_call(平均)、rejected_calls、failed_calls。我执行的次数与 calls 完全一致。KEYS 平均 24 µs(库里只有约 1000 个 key),比 GET 高两个数量级。
cmdstat_get: calls=3000,usec=601,usec_per_call=0.20,rejected_calls=7,failed_calls=0 cmdstat_set: calls=1000,usec=491,usec_per_call=0.49,rejected_calls=3,failed_calls=0 cmdstat_hget: calls=10,usec=8,usec_per_call=0.80,rejected_calls=0,failed_calls=10
对字符串 key 调 HGET 得到 WRONGTYPE:命令执行了、失败了,calls=10,failed_calls=10。参数个数不对的 GET/SET 在执行前就被拒绝,只增加 rejected_calls,不增加 calls。
latency_percentiles_usec_set: p50=0.001,p99=1.003,p99.9=5.023 latency_percentiles_usec_get: p50=0.001,p99=1.003,p99.9=3.007 latency_percentiles_usec_keys: p50=24.063,p99=31.103,p99.9=31.103
Redis 7 起 INFO latencystats 给出每个命令的 p50 / p99 / p99.9(微秒;要 latency-tracking yes)。值是服务器内部的直方图估计,精度有限。
客户端测得往返:GET 24.5 µs,KEYS 118.0 µs;服务器统计的 usec_per_call:GET 0.20,KEYS 23.66
GET 客户端往返 24.5 µs,服务器统计只有 0.20 µs;KEYS 往返 118.0 µs,服务器 23.7 µs。commandstats 只统计命令执行,不含网络、协议解析、排队(和 SLOWLOG 一样,第 96 篇)。
> CONFIG RESETSTAT "OK" 之后 cmdstat_set: None cmdstat_config|resetstat: calls=1,usec=14,usec_per_call=14.00,rejected_calls=0,failed_calls=0
CONFIG RESETSTAT 清零全部统计;之后 cmdstat_set 不存在,只有 RESETSTAT 命令自己的一行。