跳转至

延迟模型

是什么 / 解决什么问题

低延迟系统关注的不是平均耗时,而是一次请求从进入系统到产生结果的完整路径,以及这条路径的尾部延迟。交易系统里,p99p999、jitter 和最大延迟通常比平均值更能暴露问题。

核心概念

指标 含义 面试关注点
p50 中位数延迟 代表常态路径
p99 99% 请求低于该延迟 暴露偶发慢路径
p999 99.9% 请求低于该延迟 交易系统重点关注
jitter 延迟波动 影响排队、撮合、行情处理稳定性
throughput 单位时间处理量 与低延迟经常冲突

平均延迟可能掩盖尾部问题。例如 99% 请求 5us,1% 请求 2ms,平均值看起来可能仍然可接受,但交易链路里这 1% 可能已经错过价格。

延迟来源

常见来源:

  1. syscall 与上下文切换
  2. cache miss 与 NUMA 远端访问
  3. 锁竞争与线程调度
  4. 内存分配与 page fault
  5. TCP 重传、队列积压、软中断延迟
  6. 日志、监控、格式化字符串等旁路逻辑

设计取舍

低延迟系统通常会牺牲部分通用性:

  • 用固定大小对象池减少动态分配
  • 用 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,并解释差异。