【性能测试】操作系统硬件基准测试


前言

\qquad 性能测试通常包含两类即:业务层面的性能测试和服务器层面的性能测试。通常用户关心的是业务层面的性能,如“业务系统并发数”、“业务系统响应时间”、“系统吞吐量”,但是作为性能测试人员来说,需要关心整个业务链路的性能能力。以最常见的web页面响应时间为例,可进一步划分为“Web服务器处理时间”、“数据库服务响应时间”、“网络传输时间”、“操作系统处理时间”等。
\qquad 性能指标处理包括并发用户数、响应时间和系统吞吐量之外,还应包含各类资源的使用率,如系统级别的CPU占用率、内存使用率、磁盘IO和网络IO等。在进行性能测试之前应对各类硬件指标进行基准测试,确保测试硬件最大能力,满足业务系统预期。


一、术语

带宽(Bandwidth):网络或通信链路在一秒钟内可以传输的最大数据量。通常以比特每秒 (bps) 或字节每秒 (Bps) 来衡量,其中常见的单位包括 kbps(千比特/秒)、Mbps(兆比特/秒)和 Gbps(吉比特/秒)。
吞吐量(Throughput):系统在一秒钟内可以处理的最大数据量。吞吐量通常用于描述网络、磁盘或数据库系统在单位时间内能够传输的数据量,也可以用来衡量应用程序的性能表现。吞吐量通常用与带宽相同的单位表示。
IOPS(Input/Output Operations Per Second):每秒钟的输入输出操作数。这是一个用于描述存储性能的重要指标,特别是在磁盘I/O测试中使用。它可以反映出硬盘在处理读写请求时的速度和效率。
时延(Latency) :数据从发送者到接收者的传输时间延迟。在网络通信中,延迟是指数据包经过网络传输的时间。在磁盘I/O测试中,延迟指的是系统响应请求所需的时间。延迟通常以毫秒(ms)或微秒(us)来衡量。
平均吞吐量(Average Throughput):测试期间实际记录到的平均数据传输速率。它反映了在不同时间点上系统的整体表现情况。


二、测试工具概览

测试类型测试工具测试指标备注
CPUSuperPI响应时间通过计算圆周率来测试CPU运算能力
CPUgenerate_series响应时间数据库自带函数,通过计算整数相加来测试CPU运算能力
CPUUnixbench 5.1.4与基线结果计算能力倍数内置各种运算模型,完成运算时间与基线的比例来衡量CPU的运算能力
CPUSysbench 1.1相同时间内计算轮数通过指定时间内完成素数的计算来衡量CPU的运算能力
内存Stream 5.10吞吐量通过加、乘、复制以及综合三种运算来能力内存运算能力
内存mlc响应时间intel 内存时延测试工具
磁盘fioIOPS通过1M、4K块大小,顺序和随机读写来测试磁盘的IO能力
磁盘DD吞吐量Linux自带命令,可用于磁盘IO测试
网络netperf网络带宽支持TCP及UDP网络协议,单流和多流网络传输能力测试
网络iperf网络带宽用于测试IP网络最大带宽

三、硬件测试

3.1 CPU

3.1.1 SuperPI

  • 工具介绍
    SuperPI利用CPU的浮点运算能力来计算出π(圆周率),可以用做测试CPU计算特定位数圆周率所需的时间。用计算时间长短来衡量CPU核心的计算能力,计算时间越短,则CPU核心计算能力越强。
  • 测试步骤
    单核测试
# 计算到圆周率小数点后5000位所需时间,scale:指定计算到小数点后多少位
time echo "scale=5000;4*a(1)" | bc -l -q &>1

在这里插入图片描述
在这里插入图片描述
多核测试
编辑多核测试脚本

vim superpi_multicore.sh
#!/bin/bash
#获取cpu数量
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

在这里插入图片描述

在服务器上,通常一个物理核心可以虚拟出两个vCPU核心,在跑单核时单个vCPU运行superPI,另一个vCPU闲置,可以用到所有物理核心的计算能力。
当两个vCPU同时运行superPI时,用时会比单vCPU耗时长。

3.1.2 generate_series

  • 工具介绍
    针对数据库类型CPU测试,若是进行简单的测试,可以使用generate_series函数来进行测试。
  • 测试步骤
--将前一百万个正整数相加
\timing
select sum(generate_series) from generate_series(1,1000000);

在这里插入图片描述

3.1.3 Unixbench

  • 工具介绍
    Unixbench是一个用于测试unix系统性能通用的benchmark工具,测试结果是一个指数值(index value)。这个值是测试系统的测试结果与一个基线系统(默认指数值为10)测试结果得到的指数值,这样比原始值更容易得到参考价值,测试集合里面所有的测试得到的指数值结合起来得到整个系统的指数值。

  • 工具安装

#下载后解压即可
tar -xf UnixBench-5.1.4.tar.gz
cd UnixBench/

在这里插入图片描述

  • 测试步骤
    单核测试
cd UnixBench/
./Run -c 1

在这里插入图片描述
在这里插入图片描述
多核测试

#获取cpu线程数
cat /proc/cpuinfo |grep process |wc -l
./Run -c 32

在这里插入图片描述
在这里插入图片描述
tips:测试结果业务说明

测试类型测试类型业务描述
Dhrystone字符串运算测试测试字符串运算速度和效率
Whetstone浮点运算测试测试浮点运算效率和速度
Execl Throughput函数调用测试测试系统每秒execl函数调用次数
File Copy文件拷贝测试测试文件数据从一个文件到另一个文件传输速率
Pipe Throughput管道吞吐测试测试一秒钟内一个进程向一个管道写512字节数据然后再读回的次数
Pipe-based Context Switching基于管道的上下文交互测试测试两个进程通过一个管道交换一个不断增长的整数的次数
Process Creation进程创建测试测试每秒钟一个进程能产生子线程并且立即退出的次数
Shell ScriptsShell脚本测试测试一秒钟内一个进程可以启动并停止shell脚本的次数
System Call Overhead系统调用消耗测试测试进入和离开系统内核的代价,即一次系统调用代价

3.1.4 sysbench

  • 工具介绍
    sysbench测试CPU主要是在指定时间内,循环进行素数计算。素数:除1和它自身之外,不能被其他自然数整除的数。

  • 测试步骤

sysbench --threads=32 --cpu-max-prime=100000 --time=300 --report-interval=10 cpu run

在这里插入图片描述
tips:测试参数说明

类型参数说明
运行参数cpu-max-prime素数的范围上限
运行参数threads线程数,与逻辑核数保持一致
运行参数time运行时长
运行参数events event上限次数,表示完成指定次event后,停止运行
运行参数report-interval报告间隔
结果参数event完成素数计算轮次
结果参数stddev标准差,在相同时间内,多个线程分别完成素数计算次数是否稳定。数值越低,则线程间结果越接近
  • 结果说明
    1.相同时间,比较event
    2.相同event,比较时间
    3.时间和event都相同,比较stddev(标准差)在这里插入图片描述

    3.2 内存

3.2.1 stream

  • 工具介绍
    stream工具为内存带宽测试的一种常用工具,压测涉及4中业务:copy、scale、add和triad。
    在这里插入图片描述
    Copy:复制,先从内存读取一个数,复制到另一内存单元。两次内存访问操作
    Scale:乘法,先从内存读取一个数,与常数scale相乘,后写入内存单元。两次内存访问操作
    Add:加法,先从内存读取两个数相加,后写入内存单元。两次读一次写,三次内存访问操作
    Triad:包含Copy、Scale、Add,三次内存访问操作

tips:
通常Add>Triad>Copy>Scale (单位操作内,访问内存次数越多,延迟越大,带宽越大)

  • 测试步骤
    1) 编辑测试脚本
#编辑脚本
#!/bin/bash
#获取可用内存
available_mem_size=`free -m |grep Mem | awk '{print ($4)*1024*1024}'`
#计算最大array_size
array_size=$((available_mem_size/8/3))
#编译
gcc -O stream.c -fopenmp -DSTREAM_ARRAY_SIZE=$array_size -DNTIME=30 -mcmodel=medium -o stream.o
#指定运行线程数
export OMP_NUM_THREADS=$1
#执行测试
./stream.o

#添加执行权限
chmod +x stream_test.sh

参数说明

参数说明
-O编译优化级别,3为最高级别
-fopenmp启用OpenMP,适应多核环境,默认运行线程为CPU线程数
-mcmodel设置内存模型,当单个Memory Array Size大于2GB时需要设置
STREAM_ARRAY_SIZE(DN)指定测试数组a[]、b[]和c[]的Array_Size(5.9版本默认2000000,5.10版本默认10000000)。该值需要远大于CPU的L3 Cache(20MB)大小,否则测试的是CPU缓存,而非内存吞吐性能。官方建议为L3 Cache大小4倍,STERAM_ARRAY_SIZE为8byte
NTIMEkernel执行的次数
stream.c待编译的源码文件
stream.o输出可执行文件名

tips
DSTREAM_ARRAY_SIZE=最高级缓存L3(单位:byte)4倍cpu路数/8
如:双路CPU,L3Cache为32MB,则ARRAY_SIZE计算值为:321024102442/8=33554432

2)执行压测
默认线程压测

#默认使用CPU全部线程压测
./stream_test.sh

在这里插入图片描述

tips:
示例中测试设备223GB内存,使用了74.5GB来进行测试

指定线程压测

#使用16个线程压测
./stream_test.sh 16

在这里插入图片描述

3.2.2 mlc

  • 工具介绍
    应用程序从处理器缓存和从内存子系统数据获取所消耗的时间,其中存在各种延迟。mlc为intel的内存测试工具,可测试内存延时
  • 测试步骤
#解压
tar -xf mlc_v3.9a.tgz -C mlc
cd mlc/Linux/
#执行
./mlc --idel_latency -e -r -l128 -D8192

在这里插入图片描述

tips
重复执行10次,取平均值,ns值越低越好

# numa节点之间范围延迟
./mlc --latency_matrix

在这里插入图片描述

3.3 磁盘

3.3.1 DD

  • 工具介绍
    dd 命令是 Linux 和 Unix 系统中的一个强大工具,常用于复制文件和转换文件格式,但它也可以用来评估系统的磁盘 I/O 性能。通过设置不同的选项,可以模拟读写操作来测量硬盘的速度、吞吐量以及 IOPS(每秒输入输出操作数)等性能指标。
  • 测试步骤
    写入测试
# 1M块大小,写入1GB数据
dd if=/dev/zero of=/home/file bs=1M count=1024 oflag=direct
# 4k块大小,写入1GB数据
dd if=/dev/zero of=/home/file bs=4k count=262144 oflag=direct
# 8k块大小,写入1GB数据
dd if=/dev/zero of=/home/file bs=8k count=131072 oflag=direct
# 1M块大小,写入1GB数据,不跳过缓存
dd if=/dev/zero of=/home/file bs=1M count=1024

在这里插入图片描述
读取测试

# 1M块大小,读取1GB数据
dd of=/dev/null if=/home/file bs=1M count=1024 iflag=direct
# 4k块大小,读取1GB数据
dd of=/dev/null if=/home/file bs=4k count=262144 iflag=direct
# 8k块大小,读取1GB数据
dd of=/dev/null if=/home/file bs=8k count=131072 iflag=direct
# 1M块大小,读取1GB数据,不跳过缓存
dd of=/dev/null if=/home/file bs=1M count=1024

在这里插入图片描述
参数说明

参数名称说明
of指定输出文件,/dev/zero表示可以生成无限空字节
if指定输入文件,/dev/null,输出被定向到 /dev/null (即黑洞),所有数据都将丢失,但不会影响性能测量
bs测试数据块大小,通常为4k/8k/32k/1M
count指定要处理的块数量
oflag/iflag写到磁盘返回成功,非direct写入缓存返回成功
records表示实际读取或写入的块数
bytes显示了总共操作的数据量(以字节为单位)

3.3.2 FIO

  • 工具介绍
    fio是一个开源压力测试工具,主要用来测试硬盘io性能。IOPS(Input/Output Per Second):单位时间内系统能处理的IO请求数量,即每秒输入输出量(读写次数)。吞吐量(Throughput):单位时间内可以成功传输的数据量。
    最关注的指标一般是顺序读写的带宽和随机读写的IOPS,前者通常测试IO大小是1M,随机读写则选择4K。
  • 工具安装
#解压
tar -xf fio-fio-3.8.tar.gz
cd fio-fio-3.8/
#安装libao引擎
rpm -ivh libaio-devel-0.3.109-13.el7.x86_64.rpm
#编译安装
./configure && make && make install

在这里插入图片描述
在这里插入图片描述
参数说明

参数参数值参数说明
filename设备名或文件名,如:裸设备-/dev/sdb,文件-/home/test.img定义测试对象,一般是设备或者文件。如果想测试裸盘设备/dev/sdb,可以设置filename=/dev/sdb;如果想要测试文件系统性能,则可以设置filename=/home/test.img
name 测试名称定义测试名称。必填项,本地fio测试的名称,对性能没有影响。
rw测试类型,可选值有:read,write,rw,randread,randwrite,randrw定义测试的读写类型:read-顺序读,write-顺序写,rw(readwrite)- 混合顺序读写,randread- 随机读,randwrite-随机写,randrw-混合随机读写。对于读写混合类型来说,默认读写比例为1:1
rwmixwrite,rwmixread[0,100]定义在混合读写模式中,写或读所占的比例。举例来说,rwmixread值为10,则表示读写比为10:90。
ioenginesync、libaio、psync、vsync、mmap等等定义fio如何下发io请求。sync:基本的read、write io。 libaio:linux原生的异步io,linux只支持non-buffer情况下的排队操作。默认值为psync,该模式为同步io模型,异步io模型libaio,一般结合direct=1使用。
direct0或1定义是否使用direct io:值为0,表示使用buffered io;值为1,表示使用direct io。
bs带单位数字定义io的块大小,单位是k,K,m,M。默认值为4k。
numjobs正整数定义测试的进程/线程数,默认值为1,如果指定了thread参数,则使用单进程多线程模式,否则使用多进程模式。
iodepth正整数定义每个进程/线程可以同时下发的io任务数,默认为1,适用于异步io场景,同步io场景要等前一个io任务完成才能下发下一个任务,所以iodepth并不起作用。
size整数定义io操作的数据量,除非指定了runtime这个参数,fio会将指定大小的数据量全部读写完成,才会停止测试。该参数的值,可以是带单位的数字,比如size=2G,表示读/写的数据量为2G;也可以是百分比,比如size=20%,表示读写的数据量占该设备/文件的20%的空间;除了表示io操作数据量,size还表示io操作的范围,与offset配合一起读写[offset,offset+size]范围内的数据。
runtime正整数定义测试时间,以秒为单位。对于指定的文件设备,如果在测试时间内完成了读写操作,则会保持相同的负载循环进行读写。
ramp_time正整数定义测试的热身时间,以秒为单位。热身时间不计入测试统计。
thinktime正整数设置当一个io完成后,等待多少时间再下发另一个io,单位为微妙。一般用于模拟应用等待、处理事务等。
group_reportingNA汇总显示每个进程的信息,对于测试并发数大于1的情况,如果想要将所有进程/线程的测试结果进行统计,输出总的测试结果,而不是各自单独输出,可以使用此参数。
output结果输出路径结果输出文件,默认直接把结果打印到命令行,设置后会把结果写进目标文件,命令行则不显示结果。
  • 测试步骤
    1)清理缓存
echo 3 > /proc/sys/vm/drop_caches

2)执行业务
混合随机读写IOPS

#测试sda磁盘性能,块大小4k,文件大小10GB,1个线程,执行300s,混合7v3读写
fio -filename=/dev/sda -direct=1 -iodepth=64 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=10G -numjobs=1 -runtime=300 -group_reporting -name=test_r_w

在这里插入图片描述
在这里插入图片描述
随机读IOPS

fio -filename=/dev/sda -direct=1 -iodepth=64 -thread -rw=randread -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=300 -group_reporting -name=rand_read_iops_test

在这里插入图片描述
在这里插入图片描述
随机写IOPS

fio -filename=/dev/sda -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=300 -group_reporting -name=rand_write_iops_test

在这里插入图片描述
在这里插入图片描述
顺序写带宽

# session1执行压测
fio -filename=/dev/sda -direct=1 -iodepth=64 -thread -rw=write -ioengine=libaio -bs=1024k -size=10G -numjobs=1 -runtime=300 -group_reporting -name=bw_write_test
# session2 iostat查看带宽:
iostat -mtdx 2 5

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
顺序读带宽

# session1执行压测
fio -filename=/dev/sda -direct=1 -iodepth=64 -thread -rw=read -ioengine=libaio -bs=1024k -size=10G -numjobs=1 -runtime=300 -group_reporting -name=bw_read_test
# session2 iostat查看带宽:
iostat -mtdx 2 5

在这里插入图片描述
在这里插入图片描述

3.4 网络

3.4.1 netperf

  • 工具介绍
    netperf是一种网络性能测试工具,主要针对基于TCP或UDP的传输,netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/response)模式。
  • 工具安装
# 解压
tar -xf netperf-netperf-2.7.0.tar.gz -C netperf
cd netperf
#编辑安装
./configure && make && make install
which netperf
netperf -V

在这里插入图片描述
在这里插入图片描述

  • 压测步骤
    1)关闭防护墙
CentOS6.1:service iptables status
中标麒麟:service firewalld status
银河麒麟:service iptables status ;service ufw status
Ubuntu:service ufw status
凝思:service iptables status

在这里插入图片描述
2)编辑server端压测脚本streamserver.sh

#!/bin/bash
#测试64个流
connect_num=64
size=1
killall netserver
for j in `seq $connect_num`
do
    port=$[16000+j]
    netserver -p $port > netserverstream.log 2>&1 &
done

在这里插入图片描述
3)编辑client压测脚本streamclient.sh

#!/bin/bash
#测试64个流
server_ip=$1
protocol=$2
connect_num=64
size=1
killall netserver
for j in `seq $connect_num`
do
    port=$[16000+j]
    netperf -H ${server_ip} -l 60 -t ${protocol} -p $port -- -m 1400 -D  > netperfstream.log 2>&1 &
done

在这里插入图片描述
4)编辑脚本权限

chmod +x streamserver.sh
chmod +x streamclient.sh

5)在server端启动streamserver.sh脚本,并查询对应端口占用

./streamserver.sh
netstat -tunpl |grep 16063

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6)查询server端ip,在client启动压测脚本streamclient.sh

ip a
sh streamclient.sh 10.12.96.11 TCP_STREAM

在这里插入图片描述
在这里插入图片描述
7)观察网络带宽

sar -n DEV 2 20

在这里插入图片描述
参数说明

参数说明
-H host指定远端运行netserver的ip地址
-l testlen指定测试的时间长度
-t testname指定测试类型(TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR)
-s size设置本地系统的socket发送与接收缓冲大小
-S size设置远端系统的socket发送与接收缓冲大小
-m size设置本地系统发送测试分组的大小,测试PPS值为1,测试BPS时为1400
-M size设置远端系统接收测试分组的大小
-p port设置测试连接server端的端口
-D对本地与远端系统的socket设置TCP_NODELAY选项
-r req,resp设置request和response分组的大小

3.4.1 iperf

  • 工具安装
# 解压
tar -xf iperf-3-current.tar.gz
cd iperf-3.6/
# 编译安装
./configure && make && make install
which iperf3
iperf3 -version

在这里插入图片描述

  • 测试步骤
    1)Server侧执行
iperf -s -p 5001

在这里插入图片描述

2)Client侧执行

iperf -c 192.168.2.29 -t 20 -i 5 -P 4

在这里插入图片描述

参数说明
-c :客户端,-s:服务器,-p:监听端口,-t:测试时间,-i:打印间隔,-P:并发数

  • 结果说明
    网口为万兆网卡,最大传输带宽为9.41Gb/s≈1.18GB/s,网卡处理大包实际能力为网口能力的80% ~ 90%。
    在这里插入图片描述

四、参考说明

本文部分内容参考:阿里云-云服务器基准性能测试

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值