bigywater.tech
Redis · 99

INFO commandstats

INFO commandstats 是「每个命令被调用了多少次、花了多少时间」的账本。它精确吗?各字段是什么意思?failed 和 rejected 有什么区别?它的耗时和客户端看到的一样吗?这篇用已知次数的命令逐项核对。

calls 精确
执行 SET 1000 次、GET 3000 次,calls 就是 1000 和 3000
0.20 µs vs 24.5 µs
GET 的服务器 usec_per_call vs 客户端往返:统计不含网络
failed ≠ rejected
执行报错计 failed_calls;没走到执行(参数错误等)计 rejected_calls

calls 与 usec

实测 · 本机执行输出
  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 高两个数量级。

failed 与 rejected

实测 · 本机执行输出
   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 命令自己的一行。

分步演示:一份可信的账本

INFO commandstats
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / Redis 8.10.2 独立实例(本机回环端口,save 关闭),redis-cli 风格输出由自写的 RESP 客户端打印;计时用 time.perf_counter,数字每次运行会有小幅抖动。单实例,latency-tracking yes;每个命令用单连接同步执行
    • 没有验证:多线程 I/O 开启时统计是否仍精确、Lua/事务内部命令的计入方式、分位数直方图的精度、commandstats 自身对性能的开销
    京ICP备2026067502号-1京公网安备11010502063487号