延迟与吞吐为什么对立
批处理把单次操作的开销摊薄到多条记录上,吞吐因此提高,但每一条记录都要等批次凑满或超时,延迟随之上升;排队则用等待填满资源空隙,提高利用率的同时拉长排队时间。两者的边际改进方向相反,所以在线系统要按延迟目标反推批大小与队列深度,而离线与补偿链路可以用更大批次换更高吞吐。分层设定目标是常见做法。
基本信息
| 机制 | 批处理摊薄单次开销;排队填满资源间隙 |
|---|---|
| 权衡 | 批越大吞吐越高、延迟越高 |
| 分层 | 在线路径小批次;离线与补偿路径大批次 |
| 理论工具 | Little 定律用于在吞吐、延迟、并发之间换算 |
典型使用场景
- 写库批量提交:单条插入改为批量写入,吞吐提升但提交延迟上升
- 消息批量消费:一次拉取多条处理,需平衡消费延迟与吞吐
- 网络调用合并:把多次小请求合并为一次批量请求
- 缓存预热与回填:用大批次快速铺数据,允许较高延迟
- 对账与报表:离线大批次处理,优先吞吐而非单条时效
Little 定律速算
Little 定律速算
并发 = 吞吐 × 延迟(L = λ × W)
示例:目标 2000 QPS、平均延迟 50ms → 约需 100 并发
注意:容量设计用分位延迟而非平均延迟参数调整对照
| 参数 | 调大后 | 调小时注意 |
|---|---|---|
| 批大小 | 吞吐上升、单条延迟上升 | 过小则单次开销占比高,吞吐骤降 |
| 批量等待上限 | 低峰期也能凑满批,但延迟变高 | 过短会导致大量小批次,失去批处理意义 |
| 队列深度 | 能吸收下游抖动,但排队时间变长 | 过小会频繁拒绝请求 |
| 并发数 | 吞吐上升直到饱和点 | 超过拐点后延迟飙升,吞吐反而下降 |
调整方法
- 批大小:从 32 或 64 起步,按 P99 目标与压测上下调整
- 队列深度:覆盖下游抖动窗口,超限触发拒绝而非无限等待
- 等待超时:设置批量等待上限,避免低峰期凑不满不发
- 分层策略:在线小批高频,离线与补偿路径大批低频
- 复核口径:调整后同时看吞吐与 P99,两项都达标才放行
延迟目标写成 SLO(如 P99 小于 200ms)再反推实现参数,避免各环节各自优化:没有统一目标时,每个环节都会倾向于按自己的吞吐最优来调参数。
把平均延迟当作优化目标会掩盖长尾:批次等待、排队与重试都不均匀地作用于少数请求,P99 与平均值的差距往往就是用户投诉的来源。