跳转至

benchmark 方法论

是什么 / 解决什么问题

低延迟 benchmark 的目标是得到可解释的延迟分布,而不是跑出一个漂亮数字。没有控制噪声的 benchmark 很容易误导优化方向。

基本原则

  1. 固定 CPU affinity。
  2. 预热代码路径和数据结构。
  3. 避免在测量区间内分配内存、打印日志。
  4. 用直方图看分布,不只看平均值。
  5. 分离 load generator 和被测程序。
  6. 记录机器、内核、编译参数、CPU 频率策略。

测量模板

warmup
  跑足够久,让 cache、分支预测、JIT/动态链接等稳定

measure
  记录每次操作耗时
  输出 p50/p90/p99/p999/max

validate
  检查结果正确性
  检查是否发生重试、丢包、队列满

常见噪声

  • CPU 频率变化
  • 上下文切换
  • page fault
  • 其他进程抢占
  • NUMA 远端内存
  • 网络中断落在错误 CPU
  • printf/logging

观测命令

perf stat -e cycles,instructions,context-switches,cpu-migrations,page-faults ./bench
pidstat -w -p <pid> 1
numastat -p <pid>

面试回答框架

当被问“你怎么 benchmark 一个低延迟队列/网络服务”:

  1. 先定义指标:p50/p99/p999、吞吐、丢包、CPU 使用率。
  2. 控制环境:CPU 绑定、预热、关闭无关日志、固定输入。
  3. 采集分布:不要只报平均值。
  4. 用 perf 解释结果:cache miss、context switch、IPC。
  5. 做 A/B:每次只改一个变量。