4.6.7 基准测试与容量评估

基准测试与容量评估的目标是量化CPU在不同负载模型下的吞吐、延迟与资源消耗,为容量规划、扩容阈值与性能基线提供依据。测试环境应尽量与生产一致(CPU型号、内核参数、频率调节、NUMA策略、编译选项),并在测试前固定变量(关闭不必要服务、绑定CPU频率、统一CGroup限制、清空缓存或明确缓存策略)。

原理草图(测试流程与容量评估)

文章图片

测试原则与流程#

  • 明确业务模型:CPU密集、混合型或系统调用密集,区分单线程与多线程负载。
  • 选择代表性数据与请求分布:读写比例、请求大小、并发度、突发程度。
  • 设定指标:吞吐(TPS/QPS)、平均/分位延迟(P95/P99)、CPU利用率、上下文切换、IPC、每核利用率差异。
  • 基线建立:空载、轻载、中载、极限四阶段;每阶段稳定运行足够时间(5–30分钟)。
  • 可重复性:至少三轮测试取中位数,记录系统版本、内核参数和工具版本。

工具安装与环境准备(示例)#

Ubuntu/Debian

apt update
apt install -y sysbench stress-ng linux-tools-common linux-tools-$(uname -r) \
  util-linux procps git
# wrk 需编译
apt install -y build-essential libssl-dev
git clone https://github.com/wg/wrk.git /opt/wrk
cd /opt/wrk && make
ln -s /opt/wrk/wrk /usr/local/bin/wrk

CentOS/RHEL

yum install -y epel-release
yum install -y sysbench stress-ng perf util-linux procps-ng git
# wrk 编译
yum groupinstall -y "Development Tools"
yum install -y openssl-devel
git clone https://github.com/wg/wrk.git /opt/wrk
cd /opt/wrk && make
ln -s /opt/wrk/wrk /usr/local/bin/wrk

固定CPU频率与性能模式

# 查看当前 governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 设置为 performance(需 root)
for c in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
  echo performance > "$c"
done

绑定NUMA与CPU亲和性(示例)

# 将进程绑定到 NUMA node0 的 CPU
numactl --cpunodebind=0 --membind=0 -- ./your_test_binary
# 绑定指定CPU核
taskset -c 0-3 ./your_test_binary

常用CPU基准工具与命令示例#

1) sysbench(CPU计算基准)#

单核与多核测试

# 单核
sysbench cpu --cpu-max-prime=20000 --threads=1 run
# 多核(例如 8 核)
sysbench cpu --cpu-max-prime=20000 --threads=8 run

关键字段解释
- events per second:吞吐能力(事件/秒)
- total time:总耗时
- min/avg/max/95th percentile:延迟指标

期望输出片段(示例)

events per second:  2100.45
total time:         10.0002s
95th percentile:    5.15ms

2) stress-ng(多模型压力)#

# 纯CPU算术压力,8个worker,运行60秒
stress-ng --cpu 8 --timeout 60s --metrics-brief
# 系统调用压力
stress-ng --syscall 6 --timeout 60s --metrics-brief

说明
- --metrics-brief 输出每项压力的吞吐与失败计数,便于对比。

3) perf stat(微架构指标)#

# 采集IPC、分支预测、缓存命中
perf stat -e cycles,instructions,branches,branch-misses,cache-misses \
  -a -- sleep 10

解读
- IPC = instructions / cycles,低IPC可能是缓存未命中或分支预测失败。

4) hackbench(上下文切换)#

# 评估线程调度与上下文切换压力
hackbench -g 20 -l 10000

5) 业务型基准:wrk(HTTP)#

# 10线程/200连接,压测60秒
wrk -t10 -c200 -d60s http://127.0.0.1:8080/health

常见指标
- Requests/sec:吞吐
- Latency:平均与分位延迟

关键指标解读(配合命令)#

  • IPC 低 + cache-misses 高:优先检查缓存局部性与数据结构布局。
  • 上下文切换高(vmstat 1cs):线程数过多或锁竞争。
  • 负载均衡度差(mpstat -P ALL 1):线程绑定不合理或负载分发策略不佳。
  • CPU饱和:topmpstat 显示接近100%但吞吐不提升,说明达到CPU瓶颈。

命令配套采样

mpstat -P ALL 1
vmstat 1
pidstat -w 1

容量评估方法与示例#

1) 线性外推法#

公式:最大吞吐 ≈ 基线吞吐 × (目标核数 / 基线核数) × 效率因子
示例
- 4核基线吞吐 20k QPS,目标 8核,效率因子 0.85
最大吞吐 ≈ 20k × (8/4) × 0.85 = 34k QPS

2) 拐点法(饱和点)#

逐步提高并发,绘制 QPS 与 P95 延迟曲线。拐点出现时作为安全容量上限。

3) SLA驱动法#

以 P95/P99 延迟满足目标为约束,求最大稳定 QPS。

4) 冗余与峰值系数#

保留20%–40%冗余,结合峰谷比与突发流量进行容量缓冲。

基准测试执行脚本(完整示例)#

#!/usr/bin/env bash
# 文件: /opt/bench/cpu_bench.sh
# 目的: 固定频率 + sysbench + perf + 结果记录

set -euo pipefail
OUT=/opt/bench/result_$(date +%F_%H%M).log
mkdir -p /opt/bench

echo "[1] Set governor to performance" | tee -a "$OUT"
for c in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
  echo performance > "$c"
done

echo "[2] sysbench cpu single-thread" | tee -a "$OUT"
sysbench cpu --cpu-max-prime=20000 --threads=1 run | tee -a "$OUT"

echo "[3] sysbench cpu multi-thread" | tee -a "$OUT"
sysbench cpu --cpu-max-prime=20000 --threads=8 run | tee -a "$OUT"

echo "[4] perf stat 10s" | tee -a "$OUT"
perf stat -e cycles,instructions,branch-misses,cache-misses -a -- sleep 10 2>>"$OUT"

echo "[5] mpstat snapshot" | tee -a "$OUT"
mpstat -P ALL 1 5 | tee -a "$OUT"

echo "Done. Result: $OUT"

执行

chmod +x /opt/bench/cpu_bench.sh
/opt/bench/cpu_bench.sh

排错清单(常见问题)#

  1. 工具缺失或版本不兼容
    - 现象:perf: command not found
    - 处理:安装 linux-tools-$(uname -r)perf 包。
  2. 频率未固定导致结果抖动
    - 现象:多轮测试波动大
    - 处理:设置 governor 为 performance,关闭 intel_pstate 或固定频率。
  3. 容器/虚拟化限制导致“虚高/虚低”
    - 现象:CPU利用率与吞吐不一致
    - 处理:检查 cgroup 限额、vCPU超分、宿主机争用。
  4. NUMA跨节点访问
    - 现象:吞吐下降,延迟飙升
    - 处理:使用 numactl 绑定节点并验证内存策略。

练习题#

  1. 使用 sysbench cpu 分别测试 1、2、4、8 线程,记录 events/sec95th percentile,绘制曲线并判断线性扩展区间。
  2. 使用 perf stat 对比 stress-ng --cpu 8sysbench cpu 的 IPC,分析谁更偏计算密集。
  3. 使用 wrk 对一个本地 HTTP 服务进行 3 轮压测,找出 P95 延迟拐点并给出容量上限建议。

通过规范化的基准测试与容量评估,可建立可信的CPU性能基线,为扩容计划、资源配额与性能优化提供量化依据。