延迟模型¶
是什么 / 解决什么问题¶
低延迟系统关注的不是平均耗时,而是一次请求从进入系统到产生结果的完整路径,以及这条路径的尾部延迟。交易系统里,p99、p999、jitter 和最大延迟通常比平均值更能暴露问题。
核心概念¶
| 指标 | 含义 | 面试关注点 |
|---|---|---|
| p50 | 中位数延迟 | 代表常态路径 |
| p99 | 99% 请求低于该延迟 | 暴露偶发慢路径 |
| p999 | 99.9% 请求低于该延迟 | 交易系统重点关注 |
| jitter | 延迟波动 | 影响排队、撮合、行情处理稳定性 |
| throughput | 单位时间处理量 | 与低延迟经常冲突 |
平均延迟可能掩盖尾部问题。例如 99% 请求 5us,1% 请求 2ms,平均值看起来可能仍然可接受,但交易链路里这 1% 可能已经错过价格。
延迟来源¶
常见来源:
- syscall 与上下文切换
- cache miss 与 NUMA 远端访问
- 锁竞争与线程调度
- 内存分配与 page fault
- TCP 重传、队列积压、软中断延迟
- 日志、监控、格式化字符串等旁路逻辑
设计取舍¶
低延迟系统通常会牺牲部分通用性:
- 用固定大小对象池减少动态分配
- 用 CPU 亲和性减少迁移
- 用 busy polling 减少调度唤醒延迟
- 用单线程确定性流水线减少锁
- 用批处理提高吞吐,但要限制 batch 等待时间
面试高频问题¶
为什么平均延迟不够¶
因为平均值无法说明尾部请求的表现。交易链路里,慢的少数请求可能正好对应关键行情、下单或撤单路径。回答时要主动提 p99/p999、直方图、最大值和测试噪声。
latency 和 throughput 怎么权衡¶
batching 可以提高吞吐,但会引入等待时间;busy polling 可以降低延迟,但会占满 CPU;减少锁可以降低尾延迟,但可能增加实现复杂度。重点是根据 SLA 明确优化目标。
观测与练习¶
# 不要只用 time,看分布
perf stat ./app
# 观察调度和上下文切换
perf stat -e context-switches,cpu-migrations,page-faults ./app
练习:写一个 ping-pong 程序,分别用 pipe、eventfd、TCP loopback 测量 p50/p99/p999,并解释差异。