通过真实完成时间和经过校验的结果比较 Redis 批量大小。

pipelining 把很多 Redis 往返并成一次

流水线减少的是发送 Redis 命令之间的等待,实际收益必须放到具体负载里测量。远程同步循环可能主要等待网络延迟,本地循环也可能主要消耗在客户端处理、进程调度和套接字读写。两种情形都不能直接推出“任何环境都会快几倍”的结论,更不能用一次本机数字替线上系统承诺容量。 比较等价的工作 对于 N 条命令、每批 B 条,简单同步模型把约 N 次请求响应等待减少为向上取整的 N/B 次批次等待。但命令执行、响应字节、编码和解析并没有消失;一批数据仍可能跨越多次套接字写入和多个网络包。因此模型中的等待次数,不是抓包数量,也不是对真实链路 RTT 的测量。 改变 B 时,要固定命令、键分布、负载大小、连接数、客户端版本和持久化设置。否则看起来更快,可能只是做了更少工作、关掉了持久性,或者增加了并发客户端。若要测普通流水线,应显式使用 transaction=False,因为 redis-py 默认流水线还会加入 MULTI/EXEC。 下面批量一使用普通同步客户端循环,不是每次只装一条命令的流水线包装器。这样比较回答的是“应用当前请求响应循环能否从批处理受益”,而不是测出 Redis 的最大可持续吞吐,更不是剥离客户端后得到服务器的固有命令成本。 计入应用实际支付的成本 计时应覆盖命令准备,直到最后一个结果收齐。忽略构建请求或解析响应,会低估大批次给应用带来的成本。示例把缓冲、执行和结果收集都放进计时区间,而把重置数据与正确性断言放在外面;两种路径遵守相同的计时边界,才方便比较。 每个配置先预热,再变换测试顺序并重复测量,同时报告波动。这里的三次正式运行只是一个容易复现的小型比较,不是严谨的容量研究。笔记本上的调度和其它工作仍会影响结果,单次中位数不能直接升级成服务等级目标。 吞吐量也不是单条请求延迟。总耗时除以命令数,得到的是平均完成成本,不是百分之九十五或九十九请求的延迟分布。等待凑满一批,可能让最早到达的请求在执行前就排队;本例立即构造批次,没有测量真实到达节奏带来的积攒延迟。 坏掉的样子 巨型批次可能提高每秒命令数,却同时带来难以接受的停顿和内存增长。应限制条数、请求与响应字节,以及等待成批的时间;这些上限应来自代表性负载,而不是不分命令类型就照搬几百或几千条。 如果继续增大批量已经没收益,要检查客户端 CPU、响应解码、服务端命令成本、带宽和竞争负载。流水线能够通过分摊读写开销提高实际服务吞吐,但并不消除所有瓶颈。分片是可能的架构选择之一,不是曲线变平之后唯一合理的答案。 计速度也必须检查失败。丢掉回复或把错误当成功,可以轻易制造漂亮但无意义的速率。下方关闭网络自动重试,并核对每一个递增结果的完整序列。真实断连可能留下不确定的执行范围;从最后一条已知回应之后重发,对递增也不是天然安全的恢复方式。 测试负载只应留在它自己的实例中。代码会反复重置并递增一个计数器,若把目标改成共享生产库,操作风险就发生了变化。这里使用本地 Unix 套接字,也有意排除了 TCP、TLS 和远程网络路径,所以读数不能冒充跨机房链路测量。 快速验证 需要具备 C 编译器、make、curl、tar,以及 Python 3.10 或更新版本的 POSIX 环境。本次在 macOS、Python 3.14.4、Redis 8.10.1 与 redis-py 8.1.0 上实测。安装步骤只在临时目录编译使用 libc 的 Redis 核心,并将客户端放入虚拟环境,不安装系统服务。 ...

一月 20, 2028 · 2 分钟 · XB Field Notes