perf bench 内核子系统基准
更新时间:2026-09-18。
perf bench是 perf 套件内置的一组内核子系统微基准,零额外脚本就能量化调度、内存、futex、epoll 的原始开销。综合采样见 perf 实战,上下文切换原理见 线程上下文切换成本。
这个工具是做什么的
它内置若干可重复的合成负载,输出耗时/吞吐,适合:① 内核版本、调度器、NUMA/绑定变更前后对比;② 不同机型/云主机建立基线。测的是子系统原语,不是你的业务 QPS。
bash
perf bench # 列出所有可用 benchmark 集合一、调度与 IPC
bash
# 多进程/线程经 socket/pipe 做消息乒乓,反映调度 + IPC 综合开销
perf bench sched messaging # 默认:每群 20 发送者,进程 + pipe
perf bench sched messaging -t # -t 用线程而非进程
perf bench sched pipe # 单任务在 pipe 上自收自发,反映唤醒/切换开销sched pipe 循环里每次往返触发一次调度切换,常用作「上下文切换+唤醒」成本的相对指标。
二、内存
bash
perf bench mem memcpy # 多种实现(glibc/标准)大块内存拷贝吞吐
perf bench mem memset
perf bench sched mem # 线程对内存寻址(旧版名称,按 perf 版本而定)
perf bench numa # 带 NUMA 拓扑的内存访问基准(部分版本)用于评估内存带宽/拷贝实现差异;NUMA 影响可结合 numactl 与 numastat 验证绑定效果。
三、futex 与 epoll
bash
perf bench futex hash # 哈希表上的锁竞争/唤醒
perf bench futex wake # wake/wait 唤醒吞吐
perf bench futex requeue # requeue 语义开销(线程池/条件变量底层)
perf bench futex lock-ppf # 按 perf 版本支持的锁竞争场景
perf bench epoll wait # epoll_wait 事件通知处理吞吐排查锁竞争、评估线程同步原语或比较不同内核唤醒路径时,这些数字很直观;业务锁等待仍要用 perf/strace -c 在真实进程上确认。
四、怎么用结果
bash
# 多次运行取稳态;固定 CPU 频率、隔离干扰
for i in 1 2 3; do perf bench sched pipe; done
taskset -c 2 perf bench mem memcpy # 绑核减少迁移噪声只做同环境相对比较:同样硬件/编译选项/负载参数,变更前后各跑多次看中位数,而不是拿绝对值和别人比。
常见坑
- 拿微基准当业务性能:它不经过真实代码路径、缓存和锁竞争分布,不能推导接口 QPS,只反映子系统原语。
- 环境噪声大:频率升降频、其他租户、调度迁移都会影响数值;固定 governor、绑核、关超线程干扰、多跑几次。
- 跨机直接比绝对值:不同 CPU/内核/编译器结果不可直接横比,只在受控变更下做前后对比。
- perf 版本差异:不同内核版本子项命名/参数略有不同,先
perf bench看本机支持集。 - futex 场景不等于你的锁:合成竞争模式与业务并发结构不同,结论需在真实负载复核。
总结
perf bench 是随 perf 提供的内核子系统微基准集合:sched messaging/pipe 量化调度唤醒与 IPC 及上下文切换成本,mem memcpy/memset 量化内存拷贝带宽,futex hash/wake/requeue 量化锁竞争与唤醒路径,epoll wait 量化事件通知吞吐;它的正确用法是在固定 CPU 频率、绑核隔离、多次取稳态的前提下做同一环境的变更前后或机型间相对基线,而不是把合成原语数字当成业务 QPS——微基准不含真实代码路径与竞争分布,跨硬件/内核版本也不能直接比绝对值,业务侧结论仍需用 perf 与 strace 在真实进程上复核。