本文介绍如何使用Sysbench测试云服务器的CPU、内存、FileIO负载。
Sysbench是一个基于LuaJIT的可编写脚本的多线程基准测试工具。它最常用于数据库基准测试,由于其简单易用,也被用于测试非数据库服务器的工作负载。对于如何使用Sysbench测试数据库,请参考使用SysBench测试MySQL应用性能。
请参考通过向导购买实例创建一台符合以下条件的实例:
说明
本文给出的测试环境和方法仅供参考,不代表实例的真实最优性能。
通过如下方式安装Sysbench。
方式一:软件源安装
由于测试CPU、内存均为单机操作,只需要在测试机上执行如下命令,使用Linux操作系统软件源快速安装Sysbench即可。
apt update && apt -y install sysbench
yum -y install sysbench
方式二:软件源码编译安装
如需在不同操作系统之间进行比较,为避免不同软件源安装的Sysbench版本存在差异,建议参考下文使用相同版本的软件源码编译方式进行安装。
执行如下命令,安装依赖包。
Debian/Ubuntu
apt update apt -y install make automake libtool pkg-config libaio-dev
RHEL/CentOS
yum -y install make automake libtool pkgconfig libaio-devel
(可选)如有数据库测试需求,请执行如下命令,安装对应的数据库。
Debian/Ubuntu
apt -y install libmysqlclient-dev libssl-dev # 安装MySQL数据库 apt -y install libpq-dev # 安装PostgreSQL数据库
RHEL/CentOS
yum -y install mariadb-devel openssl-devel # 安装MySQL数据库(在RHEL/CentOS 5系统中替换为mysql-devel) yum -y install postgresql-devel # 安装PostgreSQL数据库
依次执行如下命令,下载源代码。本文以1.0.20版本为例。
wget -c https://codeload.github.com/akopytov/sysbench/zip/refs/tags/1.0.20 -O sysbench-1.0.20.zip unzip sysbench-1.0.20.zip cd sysbench-1.0.20
开始编译。
./autogen.sh ./configure # 默认使能MySQL。如果系统中没有mysql库,需改为“./configure --without-mysql” make -j 4 make install
安装验证。
Sysbench将安装在“/usr/local/bin/sysbench”目录,您可以执行如下命令检查版本。
sysbench --version
执行如下命令,查看Sysbench的操作方法。
sysbench --help
参数 | 说明 |
---|---|
testname | 待测试的负载,当前支持fileio(磁盘IO)、cpu、memory、threads(线程)、mutex(互斥锁)。 |
command | 通用的操作符,支持prepare、run、cleanup、help,大多数场景只用run。 |
options | 根据testname确定,主要用来控制负载的测试参数。 |
如需了解某项待测试负载的测试参数,请执行sysbench [testname] help
命令,例如:
sysbench memory help
sysbench fileio help
说明
除本文介绍的方式外,您也可以参考云服务器性能基准测试,使用UnixBench测试CPU单核/多核性能、SuperPI测试计算时长。
Sysbench的CPU测试,主要是通过执行大量的计算任务来评估CPU性能。即指定--cpu-max-prime
参数的值,默认为10000,Sysbench将“计算1~该值范围内所有的质数(也叫素数,只能被1和自身整除的数)”为1个event,最终CPU的性能表现为每秒可以计算多少个这样的event。
执行如下命令,进行CPU单核或多核性能测试。
# 单核 sysbench cpu --cpu-max-prime=20000 --threads=1 --time=120 run # 多核 sysbench cpu --cpu-max-prime=20000 --threads=`nproc` --time=120 run
参数 | 说明 |
---|---|
--cpu-max-prime | 默认为10000,表示一个event要计算10000以内的质数。 |
--threads | 线程数,默认为1。取值为1表示Sysbench仅启动1个线程进行质数的计算;指定其他值为对应的多线程数,表示Sysbench会启动多线程同时进行质数的计算。 上述多核命令中使用 nproc 计算测试系统的CPU核数,并指定对应的核数进行测试。 |
--time | 运行时长,单位秒。默认为10,表示Sysbench会在10秒内循环往复进行质数计算,每完成一轮就叫一个event。 |
说明
Sysbench还提供--events
参数来指定完成多少次event后停止测试,该参数在不同核数下不太容易指定,更建议使用--time
参数。
结果分析。
从上图可以看出,Sysbench的CPU测试指标为events per second
,平均每秒完成的event数,该值越大表示CPU计算性能越强。
注意
由于event的设定,不同--cpu-max-prime 参数得到的结果不能相互比较!
说明
对于内存性能测试,Sysbench不是第一选择,您可以参考云服务器性能基准测试,使用Stream测试带宽、MLC测试时延。
Sysbench的内存性能测试,主要是针对不同大小的块进行连续读写或者随机读写操作。在内存性能测试中,events指的是读/写一个内存块。
相比较Stream和MLC工具,Sysbench测试内存性能比较复杂,支持较多参数,需要使用正确的参数配置才能得到预期的内存性能结果,测试前您可以查看Sysbench的Memory测试参数,具体请参见获取Sysbench帮助。
执行如下命令,测试内存性能。
# 内存读 sysbench --memory-total-size=40000G --memory-block-size=512MB --memory-scope=global --memory-oper=read memory --threads=`nproc` --time=120 run # 内存写 sysbench --memory-total-size=40000G --memory-block-size=512MB --memory-scope=local --memory-oper=write memory --threads=`nproc` --time=120 run
参数 | 说明 |
---|---|
--memory-total-size | 传输数据的总大小,用于描述Sysbench读写多少内存时停止。默认为100G,在多核下可能不到1秒停止测试,会影响计算结果,建议设置为更大的值。 |
--memory-block-size | 内存块大小,读/写一个block-size即为一个event,建议大于CPU的L3 Cache。例如:L3的Cache为100MB时,内存块大小可设置为如下取值:
说明 您可以执行 |
--memory-scope | 内存访问范围,取值:
说明 在多线程压测场景下,可以通过该参数指定是多个线程操作整块申请内存还是各个线程操作自己的小块内存。如此,申请的总内存数:
|
--memory-oper | 内存操作类型,取值:
|
--threads | 线程数,默认为1。取值为1表示Sysbench仅启动1个线程进行测试。上述命令中使用nproc 计算测试系统的CPU核数,并指定对应的核数进行测试。 |
--time | 运行时长,单位秒。默认Sysbench测试10秒时间。内存测试中toal-size写完也会提前停止,由于已经设置memory-total-size为非常大的值,这里可以通过time指定内存测试运行时长。 |
结果分析。
从上图可以看出,Sysbench的内存测试指标为MiB/sec
,平均每秒测试的内存。也可以根据event的总数和完成时间反推内存读/写带宽,以上图(内存写)为例,一个event为写一个block-size(512MB),120.1638s完成26619个event,即总共写了26619 * 512MB的内存,除以耗时即是内存写带宽:26619 * 512MB / 120.1638s = 113418 MB/s。
说明
对于磁盘IO测试,Sysbench不是第一选择,您可以参考测试存储性能,使用FIO测试IO时延、IOPS和存储带宽。
Sysbench的FileIO测试,其原理就是创建文件,并对多文件进行各种不同方式的读写(file-test-mode),如顺序写、顺序读、顺序读写;随机读、随机写、随机读写。测试过程需要三个阶段:准备阶段(prepare)、运行阶段(run)、清理阶段(cleanup)。在准备阶段创建测试所需数据,这些数据将在清理阶段被删除,注意在prepare和cleanup两个命令中的参数要一致。
相比较FIO工具,Sysbench测试需要注意如下几点差异:
(可选)磁盘准备。
Sysbench无法直接测试裸盘,如果您需要测试ECS实例挂载的数据盘,请参考以下文档将磁盘挂载到文件系统中。
系统盘不需要分区格式化,创建云服务器时会自带系统盘并且自动分区格式化。
FileIO测试准备。
执行如下命令,进入测试前准备阶段(prepare)。完成后,测试目录下会多出一个测试文件,如下图所示。
sysbench fileio --file-total-size=20G --file-num=1 prepare
执行如下命令,测试云盘的IOPS和带宽。
sysbench fileio --file-total-size=20G --file-num=1 --file-test-mode=rndwr --file-block-size=4k --max-requests=0 --file-io-mode=async --file-extra-flags=direct --file-rw-ratio=1 --file-fsync-freq=0 --time=300 run
sysbench fileio --file-total-size=20G --file-num=1 --file-test-mode=rndrd --file-block-size=4k --max-requests=0 --file-io-mode=async --file-extra-flags=direct --file-rw-ratio=1 --file-fsync-freq=0 --time=300 run
sysbench fileio --file-total-size=20G --file-num=1 --file-test-mode=seqwr --file-block-size=1024k --max-requests=0 --file-io-mode=async --file-extra-flags=direct --file-rw-ratio=1 --file-fsync-freq=0 --time=300 run
sysbench fileio --file-total-size=20G --file-num=1 --file-test-mode=seqrd --file-block-size=1024k --max-requests=0 --file-io-mode=async --file-extra-flags=direct --file-rw-ratio=1 --file-fsync-freq=0 --time=300 run
参数 | 说明 |
---|---|
--file-total-size | 要创建的文件的总大小。 |
--file-num | 测试的文件数。 |
--file-test-mode | 文件读写的模式,支持:seqwr(顺序写)、seqrewr(顺序重写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)、rndrw(随机读写)。 |
--file-block-size | 在所有IO操作中使用的块大小。 |
--file-io-mode | 文件操作模式,支持:sync(同步)、async(异步)、mmap。默认为sync,影响性能,修改为async,确保libaio生效。 |
--file-extra-flags | 用于打开文件的附加标志,支持:sync、dsync、direct,这里需要修改为direct,避免文件系统缓存后写入。 |
--file-fsync-freq | 执行N条请求数量后执行fsync。0:不需要执行fsync。 |
--file-rw-ratio | 组合测试的读取/写入比率(默认1.5),涉及rw混合读写需要设置该参数。 |
--time | 默认Sysbench测试10秒时间,内存测试中file-toal-size读/写完也会提前停止,这里可以通过time指定测试运行时长。 |
FileIO测试清理。
由于fileio 测试中产生了测试文件,所以需要使用cleanup进行清理,需要注意清理的参数需要和prepare一致。
sysbench fileio --file-total-size=100G --file-num=1 cleanup
结果分析。
使用Sysbench测试结果输出示例如步骤3所示,我们只需要关注“File operations” (IOPS)和“Throughput”(带宽)部分即可。
File operations:
Throughput: