强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第九章:CPU 基准测试

第九章:CPU 基准测试

9.1 概述

CPU 是系统性能的基础。Sysbench 的 cpu 测试通过计算素数来评估 CPU 的计算能力,是最简单也是最常用的基准测试之一。

9.1.1 测试原理

Sysbench CPU 测试的核心算法是素数计算(Prime Number Calculation):

  1. 给定一个上限值 N(默认 10000)
  2. 逐个检查 2 到 N 之间的数字是否为素数
  3. 使用试除法(Trial Division):检查每个数是否能被 2 到 √n 之间的数整除
  4. 统计每秒完成的事件数(一次事件 = 检查一个数是否为素数)
算法流程:
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=N10000素数计算上限
--threads=N1线程数
--time=N10测试时长(秒)

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~4200014C
Intel Xeon Platinum 8259CL~3500~11200032C
AMD EPYC 7R32~3800~12100032C
AWS Graviton2~2800~17900064C
Apple M1~5500~400008C
Apple M2 Pro~5800~6300012C

注意:这些值仅供参考,实际结果受 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 性能

扩展阅读