前言

sysBench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。sysbench提供如下测试:
(1)CPU性能
(2)磁盘IO性能
(3)调度程序性能
(4)内存分配及传输速度
(5)POSIX线程性能
(6)数据库性能(OLTP基准测试)
sysbench支持 MySQL、PostgreSQL、Oracle 数据库。

安装

  1. # centos7
  2. yum install -y sysbench
  3. # debian 11
  4. apt install -y sysbench
  5. # 编译安装。step1:下载源码
  6. git clone https://github.com/akopytov/sysbench.git
  7. # 编译安装。step2:安装依赖(centos 7)
  8. yum -y install make automake libtool pkgconfig libaio-devel mariadb-devel openssl-devel postgresql-devel
  9. # 编译安装。step3:正式编译
  10. cd sysbench
  11. ./autogen.sh
  12. ./configure
  13. make
  14. make install

帮助文档

  1. sysbench --help

CPU测试

  1. # 帮助
  2. sysbench cpu help
  3. # 示例。要计算的素数最大值20000,开启8线程
  4. sysbench cpu --cpu-max-prime=20000 --threads=8 run

结果解释:

  1. # 所有线程每秒完成5704.79次events
  2. events per second: 5704.79
  3. # 总耗时10.0026s
  4. total time: 10.0026s
  5. # 10秒内所有线程一共完成了57073次events
  6. total number of events: 57073
  7. # 完成1次event的最少耗时,单位毫秒
  8. min: 3.03
  9. # 所有event的平均耗时
  10. avg:
  11. # 完成1次event的最多耗时
  12. max:
  13. # 95%的event在2.81毫秒内完成
  14. 95th percentile: 2.81
  15. # 平均每个线程完成3567.0625次event,标准差为9.33
  16. events (avg/stddev): 3567.0625/9.33
  17. # 每个线程平均耗时9.9997秒,标准差为0
  18. execution time (avg/stddev): 9.9997/0.00

内存测试

  1. # 帮助文档
  2. sysbench memory help
  3. # –memory-block-size=SIZE:测试内存块的大小,默认为1K。
  4. # –memory-total-size=SIZE:数据传输的总大小,默认为100G。
  5. # –memory-scope=STRING:内存访问的范围,包括全局和本地范围,默认为global。
  6. # –memory-hugetlb=[on|off]:是否从HugeTLB池分配内存的开关,默认为off。
  7. # –memory-oper=STRING:内存操作的类型,包括read, write, none,默认为write
  8. # –memory-access-mode=STRING:内存访问模式,包括seq,rnd两种模式,默认为seq。
  9. # 示例。12线程,每个内存块大小8K,数据传输总大小100G(并不是占用100G),内存访问模式为seq
  10. sysbench memory --threads=12 --memory-block-size=8K --memory-total-size=100G --memory-access-mode=seq run

硬盘IO测试

  1. # 帮助文档
  2. sysbench fileio help
  3. # –file-num=N:生成测试文件的数量,默认为128。
  4. # –file-block-size=N:测试时所使用文件块的大小,如果想磁盘针对innodb存储引擎进行测试,可以将其设置为16384(innodb存储引擎页的大小),默认为16384。
  5. # –file-total-size=SIZE:创建测试文件的总大小,默认为2G大小。
  6. # –file-test-mode=STRING:文件测试模式,seqwr(顺序写)、seqrewr(顺序读写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)、rndrw(随机读写)。
  7. # –file-io-mode=STRING:文件操作模式,sync(同步)、async(异步)、fastmmap(快速mmap)、slowmmap(慢速mmap),默认为sync。
  8. # –file-async-backlog=N:对应每个线程队列的异步操作数,默认为128。
  9. # –file-extra-flags=STRING:打开文件时的选项,与API相关的参数。
  10. # –file-fsync-freq=N:执行fsync函数的频率。fsync主要是同步磁盘文件,0代表不使用fsync函数,默认值为100。
  11. # –file-fsync-all=[on|off]:每执行完一次写操作,就执行一次fsync。默认为off。
  12. # –file-fsync-end=[on|off]:测试结束时执行fsync函数,默认为on。
  13. # –file-fsync-mode=STRING:文件同步函数选择,和API相关的参数,由于多个操作系统对于fdatasync支持不同,因此不建议使用fdatasync,默认为fsync。
  14. # –file-merged-requests=N:大多情况下,合并可能的IO的请求数,默认为0。
  15. # –file-rw-ratio=N:测试时的读写比例,默认时为1.5,即可3:2

示例

  1. 先准备测试文件

    1. # 生成16个测试文件,测试文件总大小为2G
    2. sysbench fileio --file-num=16 --file-total-size=2G prepare
  2. 执行测试

    1. # 文件测试模式为随机读,直连不用缓存
    2. sysbench fileio --file-total-size=2G --file-test-mode=rndrd --time=180 --threads=16 --file-num=16 --file-extra-flags=direct --file-fsync-freq=0 --file-block-size=16384 run
  3. 清理测试数据

    1. sysbench fileio --file-num=16 --file-total-size=2G cleanup

    OLTP基准测试(MySQL数据库测试)

    1. # 命令选项
    2. sysbench help

    示例

  4. 准备测试数据

    1. # --db-driver: 数据库驱动类型
    2. # --time: 持续访问300秒
    3. # --threads: 10线程并发
    4. # --report-interval:每1秒报告一次
    5. # --mysql-host port user password 数据库配置信息
    6. # --mysql-db --tables --table_size 测试数据库为test_db,库里建20个表,每个表100万条数据。需要事先创建库
    7. # oltp_read_write 执行oltp数据库的读写测试
    8. # --db-ps-mode 禁止ps模式(prepared statements)
    9. /usr/local/bin/sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=172.50.13.12 --mysql-port=3306 --mysql-user=root --mysql-password=dksj1312mysql --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare
  5. 测试:综合读写

    1. /usr/local/bin/sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=172.50.13.12 --mysql-port=3306 --mysql-user=root --mysql-password=dksj1312mysql --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run
  6. 测试:只读

    1. /usr/local/bin/sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=172.50.13.12 --mysql-port=3306 --mysql-user=root --mysql-password=dksj1312mysql --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_only --db-ps-mode=disable run
  7. 测试:删除

    1. /usr/local/bin/sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=30 --mysql-host=172.50.13.12 --mysql-port=3306 --mysql-user=root --mysql-password=dksj1312mysql --mysql-db=test_db --tables=20 --table_size=1000000 oltp_delete --db-ps-mode=disable run
  8. 清理测试数据

    1. /usr/local/bin/sysbench --db-driver=mysql --time=300 --threads=64 --report-interval=1 --mysql-host=172.50.13.12 --mysql-port=3306 --mysql-user=root --mysql-password=dksj1312mysql --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable cleanup

    参考文章