benchmark 方法论¶
是什么 / 解决什么问题¶
低延迟 benchmark 的目标是得到可解释的延迟分布,而不是跑出一个漂亮数字。没有控制噪声的 benchmark 很容易误导优化方向。
基本原则¶
- 固定 CPU affinity。
- 预热代码路径和数据结构。
- 避免在测量区间内分配内存、打印日志。
- 用直方图看分布,不只看平均值。
- 分离 load generator 和被测程序。
- 记录机器、内核、编译参数、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 一个低延迟队列/网络服务”:
- 先定义指标:p50/p99/p999、吞吐、丢包、CPU 使用率。
- 控制环境:CPU 绑定、预热、关闭无关日志、固定输入。
- 采集分布:不要只报平均值。
- 用 perf 解释结果:cache miss、context switch、IPC。
- 做 A/B:每次只改一个变量。