CPU/内存基准测试

基准测试

什么是基准测试:

基准测试是一种测量和评估软件性能指标的活动;

基准测试数据的实际用途

1) 了解系统性能基准作为参照物(性能问题发生后的测试很难了解系统性能基准)
2) 识别系统或环境的配置变更对性能响应带来的影响
3) 为系统优化前后的性能提升/下降提供参考指标(收集,保存基准测试结果作为测试指标)
4) 观察系统的整体性能趋势与拐点发生,及早识别系统性能风险

一、CPU基准性能测试

测试说明

SuperPI测试是利用 CPU 的浮点运算能力来计算出π(圆周率),可以用做测试系统稳定性和测试 CPU 计算完后特定位数圆周率所需的时间。

 

1、单核测试命令:
# time echo "scale=5000; 4*a(1)" | bc -l -q &>1c
其中 scale 指定计算到小数点后多少位。

说明:
计算原理简单介绍一下,由于 tan(PI/4)=1,所以有 PI=4*atan(1)。
bc 命令是任意精度计算器语言,在 linux 下当做科学计算器使用。-l 指定采用标
准数学库,-q 指定 quiet 模式,不打印欢迎语句。最后用 time 命令输出计算的时
间,可以用时间的长短来衡量 CPU 核心的计算能力,比如同样计算到 PI 的小数
点后 5000 位,计算时间越短,说明 CPU 核心的计算能力越强。

 

2、多核心测试脚本:

# vim superpi_multicore.sh
#!/bin/bash
cpu_seqs=`cat /proc/cpuinfo | grep proce | sed -e "s/.* //g" | tr -s '\n' ' '`
for cpu_seq in $cpu_seqs;do
time echo "scale=5000; 4*a(1)" | taskset -c $cpu_seq bc -l -q &>1 &
done

说明:

以上脚本先获取云主机有多少个核心,然后根据这个核心数提交对应个数的
superpi 任务,让每个核心都跑一个 superpi 任务。

测试步骤

单核测试,在测试机(node114)测试,输入命令:

# time echo "scale=5000; 4*a(1)" | bc -l -q &>1

 

 

数值越小,表明时间越短,说明单核心计算能力越强

 

多核测试,在测试机(node114)测试,输入命令:sh superpi_multicore.sh

 

 

测试结果说明:
1. 在云服务器上,通常 CPU 的核心都是 vCPU,也就是说底层物理 cpu 开启了超线程 后 , 一 个 物 理 核 心 可 以 虚 拟 出 两 个 vCPU 的 核 心 , 也 称 为 两 个 HT(HyperThreading)。

2. 对于企业级用户来说,通常为了 CPU 性能运行稳定,一般会限定同一个物理核心的虚拟出的两个 vCPU 绑定在一个云服务器实例上,也称之为 PIN 住。

3. 对于 CPU PIN 住的实例来说,对于单个物理核心上的两个 vCPU 来说,单 vCPU运行 superPI,另一个 vCPU 闲置的时候,跑 superPI 的 vcpu 是可以用到所有物理核心的计算能力的。因此对于 CPU PIN 住的云服务器来说,当两个 vCPU 同时跑 superPI 时(多进程),用时会比只有单 vCPU 跑的时候耗时会更多。如上面的测试结果就是这种情况,多进程用时比单进程用时长。

4. 如果 CPU 没有 PIN 住,跑出来的时间可能是一样的。表面上看 CPU 没有 pin 住,似乎对客户来说有利,实际上云上的环境通常是多租户的,在 CPU 没有 pin 住的时候,用户的应用更容易受到其他用户的应用的影响,从而无法获取稳定的性能输出。

 

二、内存基准测试

Stream内存带宽测试

步骤 1 Stream 使用说明
stream 是业内公认的用于内存性能评估的基准测试软件,其包括 Copy(复制)、Scale(乘法)、Add(加法)以及 Triad(三者复合)四种不同操作情况下的内存带宽表现:

复制(Copy) a(i) = b(i)

尺度变换(Scale) a(i) = q*b(i)

矢量求和(Add) a(i) = b(i) + c(i)

复合矢量求和(Triad) a(i) = b(i) + q*c(i)
 
参数设置说明:
l Copy 是复制操作,从一个内存单元中读取一个数,并复制到另一个内存单元。
l Scale 是乘法操作,从一个内存单元中读取一个数,与常数相乘后,将结果写入另一个内存单元。
l Add 是加法操作,从两个内存单元中分别读取两个数,相加后,将得到的结果写入另一个内存单元中。
l Triad 是前面三种的结合,先从内存中读取一个数,与常数相乘后,得到一个乘积,然后从另一个内存单元中读取一个数与之前的乘积相加,得到的结果再写入内存。
l 程序有三个重要参数需要设置,STREAM_ARRAY_SIZE,NTIMES 以及 OFFSET。
 
这三个参数的设置可以参考源码中的说明。
1. STREAM_ARRAY_SIZE,默认是 10000000。表示测试数据集的大小,该大小应该遵循以下两条规则。
l 数据集大小应不小于 L3 cache 大小的 4 倍。
ᅳ例如,配置两个 E5 CPU 的服务器,每个 cpu 有 20MB 的 L3 Cache,两个 cpu 共计 40MB。
ᅳ40MB*4=160MB,每个数据大小是 8Byte,因此数据集大小应该大于160MB/8B=20Million。
l 数据集大小应能确保程序输出时间大于 20 个时钟周期。
l 本例中,我们使用尽量大的 STREAM_ARRAY_SIZE 来进行测试。
 
2. NTIME。该参数为 kernel 执行的次数,程序将输出除第一次外其他结果中最好的结果,所以 NTIME 的最小值是 2。该值默认为 10,通常不许要修改。

 

步骤 2 下载 stream 源码文件

# wget https://www.cs.virginia.edu/stream/FTP/Code/stream.c
# yum -y install gcc
# ls stream.c

步骤 3 创建编译测试脚本

# vim stream_test.sh
# vim stream_test.sh
#!/bin/bash
# 获取可用 memory
available_memory_size=`free -m | grep Mem | awk '{print ($4)*1024*1024}'`
# 计算最大 array_size
array_size=$((available_memory_size/8/3))
# 编译 stream
gcc -O stream.c -fopenmp -DSTREAM_ARRAY_SIZE=$array_size -DNTIME=30 -mcmodel=medium -o stream.o
# 执行测试
/stream.o
步骤 4 执行测试
# chmod +x stream_test.sh
#./stream_test.sh

 

 Best Rate 数值越高越好

 

MLC内存延迟测试

步骤 1 MLC 使用说明

mlc 为 intel 的内存测试工具,可以有效方便的测试内存延时。

步骤 2 下载

#wget https://software.intel.com/content/dam/develop/external/us/en/protected/mlc_v3.9.tgz

步骤 3 安装

解压安装:
# tar -xzvf mlc_v3.9.tgz
# yum install -y glibc

步骤 4 测试步骤

# ./Linux/mlc --idle_latency -e -r -l128 -D8192

 

 重复运行 10 次,求平均值结果中小括号中的 ns 值,ns 数值越低越好

posted @ 2022-08-24 10:21  莫离m  阅读(2067)  评论(0编辑  收藏  举报