redis-cli 自带三个测延迟的开关:--latency、--latency-history、--latency-dist,再加一个不连服务器的 --intrinsic-latency。它们测的是「客户端到服务器的往返」,不是服务器内部的耗时。这篇在空闲和有阻塞两种情形下各跑一遍,看它们分别能发现什么。
最后一行: 0.078 0.477 0.224 72
不停发 PING,每次往返计一个样本。空闲实例上 avg 约 0.2 ms。
最后一行: 0.069 203.995 3.108 71
制造 3 次 200 ms 的阻塞:max 抓到了 203.995 ms,avg 只有 3.108 ms。看平均值几乎发现不了问题,最大值才是要看的。
窗口 1(每个窗口结束时的一行): min: 0.106, max: 0.387, avg: 0.217 (72 samples) -- 1.01 seconds range 窗口 2(每个窗口结束时的一行): min: 0.091, max: 151.485, avg: 2.318 (72 samples) -- 1.14 seconds range 窗口 3(每个窗口结束时的一行): min: 0.137, max: 0.501, avg: 0.253 (72 samples) -- 1.01 seconds range 窗口 4(每个窗口结束时的一行): min: 0.129, max: 0.449, avg: 0.252 (73 samples) -- 1.01 seconds range 窗口 5(每个窗口结束时的一行): min: 0.146, max: 0.491, avg: 0.259 (73 samples) -- 1.00 seconds range 窗口 6(每个窗口结束时的一行): min: 0.106, max: 0.396, avg: 0.229 (70 samples) -- 1.00 seconds range
每个窗口输出一行(默认 15 秒,这里 -i 1)。150 ms 的阻塞只出现在窗口 2(max: 151.485),其它窗口都没有——可以看到「什么时候」出现的尖峰。(输出用了光标控制字符不断刷新同一行,我截取每个窗口结束时的最终一行。)
A,B,C,D,E 10,20,30,40,50 milliseconds F,G,H,I,J .1,.2,.3,.4,.5 seconds K,L,M,N,O,P,Q,? 1,2,4,8,16,30,60,>60 seconds From 0 to 100%: --------------------------------------------- .-*#123456789ABCDEFGHIJKLMNOPQ? .-*#123456789ABCDEFGHIJKLMNOPQ? .-*#123456789ABCDEFGHIJKLMNOPQ?
延迟分布。每一行的字符表示各区间的占比,图例里的字母对应从毫秒到分钟的区间。这次空闲测量的样本都落在最低区间。它主要在终端里以彩色显示,文本抓取不能完整还原,所以这里只展示图例。
3801847 total runs (avg latency: 0.7891 microseconds / 789.09 nanoseconds per run). Worst run took 204x longer than the average latency.
不连接任何服务器,在本机紧循环 3 秒,记录最慢的一次比平均慢多少倍。如果这个值本身就大,说明机器(或虚拟机、容器)自己有调度抖动,Redis 再好也快不起来。平均 0.7891 µs;最差比平均慢的倍数每次运行都不同。