文章目录
前言
\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):测试期间实际记录到的平均数据传输速率。它反映了在不同时间点上系统的整体表现情况。
二、测试工具概览
| 测试类型 | 测试工具 | 测试指标 | 备注 |
|---|---|---|---|
| CPU | SuperPI | 响应时间 | 通过计算圆周率来测试CPU运算能力 |
| CPU | generate_series | 响应时间 | 数据库自带函数,通过计算整数相加来测试CPU运算能力 |
| CPU | Unixbench 5.1.4 | 与基线结果计算能力倍数 | 内置各种运算模型,完成运算时间与基线的比例来衡量CPU的运算能力 |
| CPU | Sysbench 1.1 | 相同时间内计算轮数 | 通过指定时间内完成素数的计算来衡量CPU的运算能力 |
| 内存 | Stream 5.10 | 吞吐量 | 通过加、乘、复制以及综合三种运算来能力内存运算能力 |
| 内存 | mlc | 响应时间 | intel 内存时延测试工具 |
| 磁盘 | fio | IOPS | 通过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 Scripts | Shell脚本测试 | 测试一秒钟内一个进程可以启动并停止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 even | t上限次数,表示完成指定次event后,停止运行 |
| 运行参数 | report-interval | 报告间隔 |
| 结果参数 | event | 完成素数计算轮次 |
| 结果参数 | stddev | 标准差,在相同时间内,多个线程分别完成素数计算次数是否稳定。数值越低,则线程间结果越接近 |
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 |
| NTIME | kernel执行的次数 |
| 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。 |
| ioengine | sync、libaio、psync、vsync、mmap等等 | 定义fio如何下发io请求。sync:基本的read、write io。 libaio:linux原生的异步io,linux只支持non-buffer情况下的排队操作。默认值为psync,该模式为同步io模型,异步io模型libaio,一般结合direct=1使用。 |
| direct | 0或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_reporting | NA | 汇总显示每个进程的信息,对于测试并发数大于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%。

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

2924

被折叠的 条评论
为什么被折叠?



