You need to enable JavaScript to run this app.
导航

使用Sysbench测试云服务器性能

最近更新时间2024.03.21 19:55:18

首次发布时间2024.03.21 19:44:24

本文介绍如何使用Sysbench测试云服务器的CPU、内存、FileIO负载。

Sysbench是一个基于LuaJIT的可编写脚本的多线程基准测试工具。它最常用于数据库基准测试,由于其简单易用,也被用于测试非数据库服务器的工作负载。对于如何使用Sysbench测试数据库,请参考使用SysBench测试MySQL应用性能

测试环境

请参考通过向导购买实例创建一台符合以下条件的实例:

  • 镜像:本文以Ubuntu 22.04为例。
  • 存储:为了测试到最大的IOPS和带宽,建议实例挂载的云盘容量大于等于1000GiB。

说明

本文给出的测试环境和方法仅供参考,不代表实例的真实最优性能。

安装Sysbench

  1. 登录待测试云服务器

  2. 通过如下方式安装Sysbench。

    • 方式一:软件源安装

      由于测试CPU、内存均为单机操作,只需要在测试机上执行如下命令,使用Linux操作系统软件源快速安装Sysbench即可。

      • Ubuntu/Debian
        apt update && apt -y install sysbench
        
      • CentOS
        yum -y install sysbench
        
    • 方式二:软件源码编译安装

      如需在不同操作系统之间进行比较,为避免不同软件源安装的Sysbench版本存在差异,建议参考下文使用相同版本的软件源码编译方式进行安装。

      1. 执行如下命令,安装依赖包。

        • 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
          
      2. (可选)如有数据库测试需求,请执行如下命令,安装对应的数据库。

        • 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数据库
          
      3. 依次执行如下命令,下载源代码。本文以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
        
      4. 开始编译。

        ./autogen.sh
        ./configure   # 默认使能MySQL。如果系统中没有mysql库,需改为“./configure --without-mysql”
        make -j 4
        make install
        
  3. 安装验证。
    Sysbench将安装在“/usr/local/bin/sysbench”目录,您可以执行如下命令检查版本。

    sysbench --version
    

    alt

获取Sysbench帮助

执行如下命令,查看Sysbench的操作方法。

sysbench  --help

alt

参数说明
testname待测试的负载,当前支持fileio(磁盘IO)、cpu、memory、threads(线程)、mutex(互斥锁)。
command通用的操作符,支持prepare、run、cleanup、help,大多数场景只用run。
options根据testname确定,主要用来控制负载的测试参数。

如需了解某项待测试负载的测试参数,请执行sysbench [testname] help命令,例如:

  • 获取Memory的测试参数:
    sysbench memory help
    
    alt
  • 获取FileIO的测试参数:
    sysbench fileio help
    
    alt

测试CPU负载

测试说明

说明

除本文介绍的方式外,您也可以参考云服务器性能基准测试,使用UnixBench测试CPU单核/多核性能、SuperPI测试计算时长。

Sysbench的CPU测试,主要是通过执行大量的计算任务来评估CPU性能。即指定--cpu-max-prime参数的值,默认为10000,Sysbench将“计算1~该值范围内所有的质数(也叫素数,只能被1和自身整除的数)”为1个event,最终CPU的性能表现为每秒可以计算多少个这样的event。

操作步骤

  1. 执行如下命令,进行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参数。

  2. 结果分析。

    • 单核
      alt
    • 多核
      alt

    从上图可以看出,Sysbench的CPU测试指标为events per second,平均每秒完成的event数,该值越大表示CPU计算性能越强。

    注意

    由于event的设定,不同--cpu-max-prime 参数得到的结果不能相互比较!

测试Memory负载

测试说明

说明

对于内存性能测试,Sysbench不是第一选择,您可以参考云服务器性能基准测试,使用Stream测试带宽、MLC测试时延。

Sysbench的内存性能测试,主要是针对不同大小的块进行连续读写或者随机读写操作。在内存性能测试中,events指的是读/写一个内存块。
相比较Stream和MLC工具,Sysbench测试内存性能比较复杂,支持较多参数,需要使用正确的参数配置才能得到预期的内存性能结果,测试前您可以查看Sysbench的Memory测试参数,具体请参见获取Sysbench帮助

操作步骤

  1. 执行如下命令,测试内存性能。

    # 内存读
    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时,内存块大小可设置为如下取值:

    • 测试单线程:block-size设置为128MB即可。
    • 测试多线程:
      • 若memory-scope=global,block-size设置为128MB即可。
      • 若memory-scope=local,且threads=8,此时block-size需设置大于16MB。

    说明

    您可以执行lscpu命令,查看L3 Cache容量。
    alt

    --memory-scope

    内存访问范围,取值:

    • global(默认):全局
    • local:局部

    说明

    在多线程压测场景下,可以通过该参数指定是多个线程操作整块申请内存还是各个线程操作自己的小块内存。如此,申请的总内存数:

    • memory-scope=global时,申请的总内存为memory_block_size
    • memory-scope=local时,申请的总内存为memory_block_size * threads

    --memory-oper

    内存操作类型,取值:

    • write(默认)
    • read
    • none
    --threads线程数,默认为1。取值为1表示Sysbench仅启动1个线程进行测试。上述命令中使用nproc计算测试系统的CPU核数,并指定对应的核数进行测试。
    --time运行时长,单位秒。默认Sysbench测试10秒时间。内存测试中toal-size写完也会提前停止,由于已经设置memory-total-size为非常大的值,这里可以通过time指定内存测试运行时长。
  2. 结果分析。

    • 内存读
      alt
    • 内存写
      alt

    从上图可以看出,Sysbench的内存测试指标为MiB/sec,平均每秒测试的内存。也可以根据event的总数和完成时间反推内存读/写带宽,以上图(内存写)为例,一个event为写一个block-size(512MB),120.1638s完成26619个event,即总共写了26619 * 512MB的内存,除以耗时即是内存写带宽:26619 * 512MB / 120.1638s = 113418 MB/s。

测试FileIO负载

测试说明

说明

对于磁盘IO测试,Sysbench不是第一选择,您可以参考测试存储性能,使用FIO测试IO时延、IOPS和存储带宽。

Sysbench的FileIO测试,其原理就是创建文件,并对多文件进行各种不同方式的读写(file-test-mode),如顺序写、顺序读、顺序读写;随机读、随机写、随机读写。测试过程需要三个阶段:准备阶段(prepare)、运行阶段(run)、清理阶段(cleanup)。在准备阶段创建测试所需数据,这些数据将在清理阶段被删除,注意在prepare和cleanup两个命令中的参数要一致。

相比较FIO工具,Sysbench测试需要注意如下几点差异:

  • Sysbench必须要挂载磁盘并cd到该目录下测试(即测试文件系统下的文件读写),而FIO更多的是测试裸盘,所以可能存在性能上的差异;
  • Sysbench FileIO测试默认通过pwrite/pread,性能较FIO(使用libaio做后端)差,所以测试时需要通过参数来指定使用libaio;
  • Sysbench提供的Latency是基于event统计,统计口径可能和FIO不一致;此外测试IO时延通常选择FIO并指定iodepth为1,且FIO可以提供USEC级别的时延数据,这些都是Sysbench无法做到的,所以无法使用Sysbench测试IO时延。

操作步骤

  1. (可选)磁盘准备。
    Sysbench无法直接测试裸盘,如果您需要测试ECS实例挂载的数据盘,请参考以下文档将磁盘挂载到文件系统中。

    系统盘不需要分区格式化,创建云服务器时会自带系统盘并且自动分区格式化。

  2. FileIO测试准备。
    执行如下命令,进入测试前准备阶段(prepare)。完成后,测试目录下会多出一个测试文件,如下图所示。

    sysbench fileio --file-total-size=20G --file-num=1 prepare
    

    alt

  3. 执行如下命令,测试云盘的IOPS和带宽。

    • 测试云盘的随机写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
      
      alt
    • 测试云盘的随机读IOPS
      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
      
      alt
    • 测试云盘的顺序写带宽
      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
      
      alt
    • 测试云盘的顺序读带宽
      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
      
      alt
    参数说明
    --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指定测试运行时长。
  4. FileIO测试清理。
    由于fileio 测试中产生了测试文件,所以需要使用cleanup进行清理,需要注意清理的参数需要和prepare一致。

    sysbench fileio --file-total-size=100G --file-num=1 cleanup
    
  5. 结果分析。
    使用Sysbench测试结果输出示例如步骤3所示,我们只需要关注“File operations” (IOPS)和“Throughput”(带宽)部分即可。

    • File operations:

      • reads/s : 读IOPS
      • writes/s: 写IOPS
    • Throughput:

      • read, MiB/s: 读带宽
      • written, MiB/s:写带宽