如何进行基准测试?
作者:刘洪初 编辑:毕小烦
基准测试(benchmarking)其实就是一种性能测试,只不过会偏向于强调可对比性。
在计算机领域,基准是指运行一个计算机程序、一组程序或其他操作的行为,以评估一个对象的相对性能,通常是通过对它进行一些标准测试和试验。-- 维基百科
比如,为了评价一款新手机的性能,我们经常会运行一些所谓的「跑分」软件,这里的跑分其实就是一种基准测试。至于软件工程领域,比如在修改了数据库的配置后需要重新执行测试观察软件的性能变化,这也是一种基准测试。
基准测试一般用于比较多个事物之间的性能,既可以针对彼此也可以针对业界公认的标准。我们可以在某个阶段通过基准测试建立一个性能标准,当系统的软硬件环境发生变化之后,再进行一次基准测试,以验证这些变化对性能带来的影响。
其主要还是为了发现性能问题和预防性能问题。
通常在以下几种情况我们会进行基准测试:
软件进行了重构或者更新了和老模块有交叉的功能,需要执行测试验证软件性能标准是否出现变化; 软件将要部署到一套不同配置的新环境,需要判断新环境是否会出现性能问题; 软件已经部署在新环境并且出现了问题,需要判断是否是数据库、Redis 等产生的问题; 修改了数据库、Redis 等基础软件的配置后,检查是否性能出现变化或者达到预期。
如何进行基准测试呢?
基准测试通常分为以下三类:
在固定环境下对业务软件的测试; 对 CPU、网络等基础硬件资源的测试; 对数据库、Redis 等基础软件资源的测试。
由于对业务软件的测试属于常规性能测试范畴,本文主要介绍对基础资源如何开展基准测试。
1. 数据库和系统性能基准测试工具 - sysbench
sysbench[1] 是一款开源的 Linux 平台测试工具,也是最受欢迎的基准测试工具之一。sysbench 支持 CPU、内存、磁盘 IO 和数据库等多目标的测试。
安装
官方提供了 Linux 平台下的安装脚本,可以执行以下命令直接安装:
Ubuntu
$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
$ sudo apt -y install sysbench
CentOS
$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
$ sudo yum -y install sysbench
使用
sysbench 是一款命令行工具,执行语法如下:
sysbench [options]... [testname] [command]
说明:
testname 指定测试种类,如 cpu
、memory
等。command 指定测试指令,该参数主要针对于某些特定测试种类,如磁盘io,用于准备和清理测试数据。主要指令: prepare
:生成测试数据,比如测试磁盘读取速度时,在该阶段生成指定大小和数量的测试文件。run
:执行测试。cleanup
:清理prepare
时生成的测试数据。help
:查看测试说明。options 指定具体的测试参数,通常以 --
开头,可以有一个或多个。
测试 CPU
sysbench 对 CPU 的测试方法是计算素数直到某个最大值时所需要的时间。
测试配置参数:
配置项 | 说明 |
---|---|
--cpu-max-prime | 生成素数的上限。 |
--threads | 工作线程数。 |
--time | 运行时间,计算达到设置的素数上限但时间不足时会重新开始计算,直到达到指定的时长。 |
命令示例:
$ sysbench cpu --cpu-max-prime=20000 --threads=2 run
测试结果:
CPU speed:
events per second: 650.74 // 每秒运行了650次计算
General statistics:
total time: 10.0017s // 共耗时10秒
total number of events: 6510 // 10秒内一共完成了6510次计算
Latency (ms):
min: 3.03 // 完成1次计算最少耗时3.03秒
avg: 3.07 // 每次计算的平均耗时3.07毫秒
max: 3.27 // 完成1次计算的最多耗时3.27毫秒
95th percentile: 3.13 // 95%次计算在3.13秒毫秒内完成
sum: 19999.91 // 每个线程耗时10秒,2个线程叠加耗时就是20秒
Threads fairness:
events (avg/stddev): 3255.0000/44.00 // 平均每个线程完成3255次计算,标准差为44。标准差越低,线程性能越稳定
execution time (avg/stddev): 10.0000/0.00 // 每个线程平均耗时10秒,标准差为0
测试磁盘 IO
sysbench 对磁盘 IO 的测试方法是读、写指定大小的文件。
测试配置参数:
配置项 | 说明 |
---|---|
--file-test-mode | 操作类型,支持顺序读、随机写、随机读写等。 |
--file-num | 测试文件数量。 |
--file-total-size | 测试文件大小。 |
--time | 运行时间。 |
命令示例:
sysbench fileio –file-test-mode=rndrd --file-num=1 --file-total-size=4G prepare
sysbench fileio –file-test-mode=rndrd --file-num=1 --file-total-size=4G run
sysbench fileio –file-test-mode=rndrd --file-num=1 --file-total-size=4G cleanup
测试结果:
……
read: IOPS=4655.33 72.74 MiB/s (76.27 MB/s) // 读取IOPS和读取速度
write: IOPS=3103.56 48.49 MiB/s (50.85 MB/s) // 写入IOPS和写入速度
……
2. 网络性能测试工具 - iperf3
iperf3[2] 是一款网络性能测试工具,支持 TCP 和 UDP,可以测试带宽、延迟抖动、丢包率等结果。
安装
iperf3 可以直接通过以下地址下载:
https://downloads.es.net/pub/iperf/
使用
iperf3 在测试网络性能时需要在测试机和目标机上同时运行该工具,工具会互相传送数据以测试测试机和目标机之间的网络情况。
iperf3 同样是一款命令行工具,主要执行参数如下:
-s:服务器模式
-c:客户端模式
-p:连接端口
-u:udp模式
-t:测试时长
-n:传输包大小
-b: 目标带宽
命令示例:
$ iperf3 –s // 启动服务端
$ iperf3 –c 10.199.155.225 -t 10 -b 70M // 启动客户端并连接服务端
结果示例:
……
0.00-10.00 sec 14.0 Mbytes(数据量) 1.40 MBytes/sec(带宽) 216(重传次数)
sender(上行)
0.00-10.00 sec 13.8 MBytes (数据量) 1.38 MBytes/sec (带宽)
receiver(下行)
……
总结
找好指标,选好工具,用对方法,多次对比是基准测试成功的根本,本文只介绍了两款针对基础资源的基准测试工具,当然还有其他好用的工具,欢迎一起交流。
参考资料
sysbench: https://github.com/akopytov/sysbench
[2]iperf3: https://github.com/esnet/iperf
(完)
推荐阅读
如果你想玩转 Dubbo 接口测试?一定要知道这 3 种姿势
如果文章对你有帮助,记得留言、点赞、加关注哦!