第九章:CPU 基准测试
第九章:CPU 基准测试
9.1 概述
CPU 是系统性能的基础。Sysbench 的 cpu 测试通过计算素数来评估 CPU 的计算能力,是最简单也是最常用的基准测试之一。
9.1.1 测试原理
Sysbench CPU 测试的核心算法是素数计算(Prime Number Calculation):
- 给定一个上限值 N(默认 10000)
- 逐个检查 2 到 N 之间的数字是否为素数
- 使用试除法(Trial Division):检查每个数是否能被 2 到 √n 之间的数整除
- 统计每秒完成的事件数(一次事件 = 检查一个数是否为素数)
算法流程:
for n = 2 to N:
is_prime = true
for i = 2 to sqrt(n):
if n % i == 0:
is_prime = false
break
count_prime += is_prime
9.1.2 测试特点
| 特点 | 说明 |
|---|
| 计算密集型 | 主要消耗 CPU,几乎不涉及 I/O |
| 整数运算 | 以整数除法和取模为主 |
| 无缓存依赖 | 不依赖 CPU 缓存大小 |
| 可重复性 | 相同配置下结果高度一致 |
| 受编译优化影响 | 编译器优化标志会影响性能 |
9.2 基本用法
9.2.1 最简单的 CPU 测试
# 单线程 CPU 测试,默认 10 秒
sysbench cpu run
# 指定线程数和时长
sysbench cpu --threads=8 --time=60 run
9.2.2 输出解读
CPU speed:
events per second: 5678.90 ← 每秒完成的素数检查次数(核心指标)
General statistics:
total time: 60.0012s
total number of events: 340734
Latency (ms):
min: 0.68 ← 最小延迟
avg: 0.70 ← 平均延迟
max: 3.45 ← 最大延迟
95th percentile: 0.73 ← P95 延迟
sum: 42001.34
Threads fairness:
events (avg/stddev): 85183.5000/12.34
execution time (avg/stddev): 15.0003/0.00
| 指标 | 含义 |
|---|
| events per second | 每秒事件数,CPU 性能的直接指标 |
| avg latency | 平均每个事件的处理时间 |
| stddev | 标准差,越小表示各线程负载越均衡 |
9.3 CPU 测试选项
9.3.1 核心选项
| 选项 | 默认值 | 说明 |
|---|
--cpu-max-prime=N | 10000 | 素数计算上限 |
--threads=N | 1 | 线程数 |
--time=N | 10 | 测试时长(秒) |
9.3.2 素数上限对结果的影响
# 不同素数上限测试
for prime in 1000 5000 10000 50000 100000 500000 1000000; do
echo -n "Prime=$prime: "
sysbench cpu --cpu-max-prime=$prime --threads=1 --time=10 run 2>&1 \
| grep "events per second" | awk '{print $4}'
done
预期结果:
素数上限 events/sec 说明
1,000 ~50000 上限太小,开销占比高
5,000 ~15000 较低计算量
10,000 ~8000 默认值,平衡
50,000 ~2500 较大计算量
100,000 ~1400 大素数计算密集
500,000 ~350 非常密集
1,000,000 ~180 极端计算密集
注意:素数上限越大,每个事件的计算量越大,events/sec 会降低,但更能反映纯计算性能。
9.3.3 选择合适的素数上限
| 场景 | 推荐素数上限 | 原因 |
|---|
| 快速验证 | 1000-5000 | 快速得到结果 |
| 标准基准 | 10000(默认) | 通用基准,结果可对比 |
| CPU 密集评估 | 100000+ | 更接近真实计算密集场景 |
| 超大规模测试 | 1000000 | 长时间运行,观察 CPU 稳定性 |
9.4 多核扩展性测试
9.4.1 扩展性测试方法
#!/bin/bash
# cpu_scalability.sh - CPU 多核扩展性测试
echo "线程数,Events/sec,平均延迟(ms),P95延迟(ms),加速比"
single_eps=""
for threads in 1 2 4 8 16 32 64; do
result=$(sysbench cpu --cpu-max-prime=10000 --threads=$threads --time=30 run 2>&1)
eps=$(echo "$result" | grep "events per second" | awk '{print $4}')
avg=$(echo "$result" | grep "avg:" | awk '{print $2}')
p95=$(echo "$result" | grep "95th" | awk '{print $3}')
# 计算加速比
if [ -z "$single_eps" ]; then
single_eps=$eps
speedup="1.00"
else
speedup=$(echo "scale=2; $eps / $single_eps" | bc)
fi
echo "$threads,$eps,$avg,$p95,$speedup"
done
9.4.2 理想 vs 实际扩展性
线程数 理想加速比 实际加速比 效率
1 1.00 1.00 100%
2 2.00 1.98 99%
4 4.00 3.92 98%
8 8.00 7.60 95%
16 16.00 14.2 89%
32 32.00 25.6 80%
64 64.00 42.0 66%
扩展性降低的常见原因:
| 原因 | 说明 |
|---|
| 线程调度开销 | 操作系统调度线程需要时间 |
| 内存带宽瓶颈 | 多核共享内存总线 |
| CPU 缓存争用 | 多核竞争 L3 缓存 |
| NUMA 效应 | 跨 NUMA 节点访问内存延迟增加 |
| Turbo Boost | 单核时频率更高,多核时频率降低 |
| 超线程 | 物理核 vs 逻辑核的性能差异 |
9.5 CPU 性能基线测试
9.5.1 标准基线测试
#!/bin/bash
# cpu_baseline.sh - CPU 性能基线测试
echo "=== CPU 性能基线测试 ==="
echo "时间: $(date)"
echo "CPU: $(lscpu | grep 'Model name' | cut -d: -f2 | xargs)"
echo "核心数: $(nproc)"
echo ""
echo "--- 单核性能 ---"
sysbench cpu --cpu-max-prime=10000 --threads=1 --time=60 run 2>&1 | \
grep -E "(events per second|avg:|95th)"
echo ""
echo "--- 满核性能 ---"
sysbench cpu --cpu-max-prime=10000 --threads=$(nproc) --time=60 run 2>&1 | \
grep -E "(events per second|avg:|95th)"
echo ""
echo "--- 大素数计算 ---"
sysbench cpu --cpu-max-prime=100000 --threads=1 --time=60 run 2>&1 | \
grep -E "(events per second|avg:|95th)"
9.5.2 多服务器对比
#!/bin/bash
# compare_servers.sh - 多服务器 CPU 性能对比
SERVERS=("server1" "server2" "server3")
echo "服务器,单核性能(eps),满核性能(eps),核心数,加速比"
for server in "${SERVERS[@]}"; do
single=$(ssh $server "sysbench cpu --threads=1 --time=30 run" 2>&1 | \
grep "events per second" | awk '{print $4}')
cores=$(ssh $server "nproc")
multi=$(ssh $server "sysbench cpu --threads=$cores --time=30 run" 2>&1 | \
grep "events per second" | awk '{print $4}')
speedup=$(echo "scale=2; $multi / $single" | bc)
echo "$server,$single,$multi,$cores,$speedup"
done
9.6 NUMA 架构测试
9.6.1 NUMA 简介
NUMA (Non-Uniform Memory Access) 架构:
┌─────────────────┐ ┌─────────────────┐
│ NUMA Node 0 │ │ NUMA Node 1 │
│ ┌────┐ ┌────┐ │ │ ┌────┐ ┌────┐ │
│ │CPU0│ │CPU1│ │ │ │CPU2│ │CPU3│ │
│ └────┘ └────┘ │ │ └────┘ └────┘ │
│ Memory 0 │ │ Memory 1 │
└────────┬────────┘ └────────┬────────┘
│ │
└─────── QPI/UPI ──────┘
(跨节点访问延迟高)
9.6.2 NUMA 测试脚本
#!/bin/bash
# numa_test.sh - NUMA 架构对 CPU 性能的影响
# 查看 NUMA 拓扑
echo "=== NUMA 拓扑 ==="
numactl --hardware
echo ""
# 查看每个 NUMA 节点的 CPU
echo "=== NUMA 节点 CPU 映射 ==="
lscpu | grep "NUMA"
echo ""
# 在单个 NUMA 节点上运行
for node in 0 1; do
echo "=== NUMA Node $node ==="
cpus=$(numactl --hardware | grep "node $node cpus:" | cut -d: -f2 | tr ' ' ',' | sed 's/^,//')
numactl --cpunodebind=$node --membind=$node \
sysbench cpu --threads=8 --time=30 run 2>&1 | \
grep "events per second"
done
# 跨 NUMA 节点运行
echo "=== 跨 NUMA 节点 ==="
numactl --interleave=all \
sysbench cpu --threads=16 --time=30 run 2>&1 | \
grep "events per second"
9.7 CPU 优化验证
9.7.1 编译器优化对比
Sysbench 本身的编译优化会影响 CPU 测试结果:
# 使用不同优化级别编译 sysbench
# -O0 (无优化)
CFLAGS="-O0" ./configure --prefix=/tmp/sysbench_O0 && make clean && make -j$(nproc) && make install
/tmp/sysbench_O0/bin/sysbench cpu --threads=1 --time=30 run 2>&1 | grep "events per second"
# -O2 (标准优化)
CFLAGS="-O2" ./configure --prefix=/tmp/sysbench_O2 && make clean && make -j$(nproc) && make install
/tmp/sysbench_O2/bin/sysbench cpu --threads=1 --time=30 run 2>&1 | grep "events per second"
# -O3 (高级优化)
CFLAGS="-O3" ./configure --prefix=/tmp/sysbench_O3 && make clean && make -j$(nproc) && make install
/tmp/sysbench_O3/bin/sysbench cpu --threads=1 --time=30 run 2>&1 | grep "events per second"
# -O3 -march=native (针对本机 CPU 优化)
CFLAGS="-O3 -march=native" ./configure --prefix=/tmp/sysbench_native && make clean && make -j$(nproc) && make install
/tmp/sysbench_native/bin/sysbench cpu --threads=1 --time=30 run 2>&1 | grep "events per second"
9.7.2 CPU 频率影响
#!/bin/bash
# cpu_freq_test.sh - CPU 频率对性能的影响
# 查看当前频率
echo "当前 CPU 频率:"
cat /proc/cpuinfo | grep "cpu MHz" | head -1
# 设置 performance 模式(最高频率)
echo "设置 performance 模式..."
sudo cpupower frequency-set -g performance
sleep 5
echo "=== Performance 模式 ==="
sysbench cpu --threads=1 --time=30 run 2>&1 | grep "events per second"
# 设置 powersave 模式(最低频率)
echo "设置 powersave 模式..."
sudo cpupower frequency-set -g powersave
sleep 5
echo "=== Powersave 模式 ==="
sysbench cpu --threads=1 --time=30 run 2>&1 | grep "events per second"
# 恢复默认
sudo cpupower frequency-set -g schedutil
9.8 不同 CPU 对比
9.8.1 云服务器 CPU 对比
#!/bin/bash
# cloud_cpu_compare.sh - 云服务器 CPU 性能对比
# 在不同实例上运行此脚本
echo "=== 实例信息 ==="
echo "实例类型: $(curl -s http://100.100.100.200/latest/meta-data/instance-type 2>/dev/null || echo 'Unknown')"
echo "CPU 型号: $(lscpu | grep 'Model name' | cut -d: -f2 | xargs)"
echo "CPU 核心: $(nproc)"
echo "CPU 频率: $(lscpu | grep 'CPU MHz' | cut -d: -f2 | xargs)"
echo ""
echo "=== 测试结果 ==="
for threads in 1 2 4 8 16; do
echo -n "Threads=$threads: "
sysbench cpu --cpu-max-prime=10000 --threads=$threads --time=30 run 2>&1 | \
grep "events per second" | awk '{print $4, "eps"}'
done
9.8.2 典型 CPU 性能参考
| CPU 型号 | 单核 (eps) | 满核 (eps) | 核心数 |
|---|
| Intel Xeon E5-2680 v4 | ~3000 | ~42000 | 14C |
| Intel Xeon Platinum 8259CL | ~3500 | ~112000 | 32C |
| AMD EPYC 7R32 | ~3800 | ~121000 | 32C |
| AWS Graviton2 | ~2800 | ~179000 | 64C |
| Apple M1 | ~5500 | ~40000 | 8C |
| Apple M2 Pro | ~5800 | ~63000 | 12C |
注意:这些值仅供参考,实际结果受 Sysbench 版本、编译选项、系统负载等因素影响。
9.9 CPU 测试的局限性
9.9.1 Sysbench CPU 测试不代表什么
| 不代表 | 说明 |
|---|
| 浮点性能 | Sysbench 使用整数运算,不代表浮点计算能力 |
| SIMD/AVX 性能 | 未使用向量指令集 |
| 内存性能 | 不涉及大量内存访问 |
| 实际应用性能 | 不同应用有不同的计算模式 |
| 多线程扩展性上限 | 受限于测试算法的并行度 |
9.9.2 何时需要其他工具
| 需求 | 推荐工具 |
|---|
| 综合 CPU 基准 | Geekbench, SPEC CPU |
| 浮点性能 | LINPACK, STREAM |
| 向量/SIMD 性能 | SIMD Microbenchmark |
| 内存带宽 | STREAM, lmbench |
| 综合系统性能 | UnixBench, Phoronix Test Suite |
9.10 小结
| 要点 | 说明 |
|---|
| 核心指标 | events per second(每秒事件数) |
| 默认设置 | 素数上限 10000,单线程 |
| 扩展性测试 | 从 1 线程递增,观察加速比 |
| 素数上限 | 越大越接近纯计算性能 |
| 注意事项 | 编译优化、CPU 频率、NUMA 架构 |
| 局限性 | 仅测试整数计算,不代表全面 CPU 性能 |
扩展阅读