MySQL 基准测试

sysbench介绍

sysbench 是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。 它主要包括以下几种方式的测试:

  1. cpu性能
  2. 磁盘io性能
  3. mutex性能
  4. 内存分配及传输速度
  5. POSIX线程性能
  6. 数据库性能(OLTP基准测试) 目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。

CentOS 二进制包安装

1
2
3
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | bash 
yum -y install sysbench
sysbench --version  # 验证sysbench是否安装成功
  1. 性能指标 (吞吐量、延迟)
    1. TPS :Transactions Per Second ,即数据库每秒执行的事务数,以 commit 成功次数为准。
    2. QPS :Queries Per Second ,即数据库每秒执行的 SQL 数(含 insert、select、update、delete 等)。
    3. RT :Response Time ,响应时间。包括平均响应时间、最小响应时间、最大响应时间、每个响应时间的查询占比。 比较需要重点关注的是,前 95-99% 的最大响应时间。因为它决定了大多数情况下的短板。
    4. Concurrency Threads :并发量,每秒可处理的查询请求的数量。
  2. 测试步骤
    1. 准备数据 prepare
    2. 执行测试 run
    3. 清理数据 clean
  3. CPU性能测试
    1. sysbench cpu help # 查看帮助信息
    2. 测试命令: 最大质数发生器数量为2000,线程数为2 sysbench cpu –cpu-max-prime=20000 –threads=2 run
  4. 内存分配及传输速度
    1. sysbench memory help # 查看帮助信息
    2. 测试命令:测试整个过程是在内存中传输 2G 的数据量,每个 block 大小为 8K sysbench memory –memory-block-size=8k –memory-total-size=2G run
  5. 磁盘IO性能测试
    1. sysbench fileio help # 查看帮助信息
    2. prepare阶段,生成需要的测试文件,完成后会在当前目录下生成很多小文件 sysbench fileio –threads=2 –file-total-size=1G –file-test-mode=rndrw prepare
    3. run阶段 sysbench fileio –threads=2 –file-total-size=1G –file-test-mode=rndrw run
    4. 清理测试时生成的文件 sysbench fileio –threads=2 –file-total-size=1G –file-test-mode=rndrw cleanup
  6. mutex性能测试
    1. sysbench mutex help # 查看帮助信息
    2. 命令测试:线程数为2,数组互斥的总大小4096,每个线程互斥锁的数量为50000,内部互斥锁的空循环数量为10000 sysbench mutex –threads=2 –mutex-num=4096 –mutex-locks=50000 –mutex-loops=10000 run
  7. POSXI线程性能
    1. sysbench threads help # 查看帮助信息
    2. 命令测试:线程数为2,每个请求产生多少个线程为100,每个线程的锁的数量为4 sysbench threads –threads=2 –thread-yields=100 –thread-locks=4 run
  8. 数据库性能(OLTP基准测试)(准备数据,压测数据,清理数据)

8.1 准备数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
mysql -uroot -p               #进入数据库
> create database sbtest;     #创建测试数据库
sysbench /usr/share/sysbench/oltp_read_write.lua  
--mysql-host=localhost   #数据库的IP
--mysql-port=3306    #数据库的端口
--mysql-user=root    #数据库用户名
--mysql-password='test'  #用户密码
--mysql-socket=/data/mysql/mysql.sock   #socket的路径
--mysql-db=sbtest   #数据库名字,默认为sysbench,需要提前创建创好
--db-driver=mysql  #用到的数据库类型 
--tables=10    #生成10张表
--table-size=50000   #每个表的行数
--threads=4    #启动多少个线程,即模拟多少个用户
prepare
> show tables; #查看表

8.2 查询测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
sysbench /usr/share/sysbench/oltp_read_write.lua  
--mysql-host=localhost  
--mysql-port=3306   
--mysql-user=root  
--mysql-password='test'  
--mysql-socket=/data/mysql/mysql.sock   
--mysql-db=sbtest  
--db-driver=mysql   
--tables=10  
--table-size=50000    
--report-interval=10  
--threads=128  
--time=600  
run
  • 测试结果指标:
  • QPS(Query per second) 每秒查询量
  • TPS(Transaction per second)每秒事务量

8.3 在每个查询的事物里面添加 INSERT/UPDATE/DELDETE 操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
sysbench /usr/local/sysbench/share/sysbench/oltp_read_write.lua  
--mysql-host=localhost  
--mysql-port=3306   
--mysql-user=root  
--mysql-password='test'  
--mysql-socket=/data/mysql/mysql.sock   
--mysql-db=sbtest  
--db-driver=mysql   
--tables=10  
--table-size=50000   
--delete_inserts=10  
--index_updates=10  
--non_index_updates=10   
--report-interval=10  
--threads=4  
--time=60  
run 

8.4 删除测试数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
sysbench /usr/share/sysbench/oltp_read_write.lua  
--mysql-host=localhost 
--mysql-port=3306  
--mysql-user=root 
--mysql-password='test' 
--mysql-socket=/data/mysql/mysql.sock  
--mysql-db=sbtest 
--db-driver=mysql  
--tables=10 
--table-size=50000  
--delete_inserts=10 
--index_updates=10 
--non_index_updates=10  
--report-interval=10 
--threads=4 
--time=60  
cleanup

基准测试简介

  • 什么是基准测试:数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。
  • 基准测试与压力测试:基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑,更加简单、直接、易于测试, 数据可以由工具生成,不要求真实;而压力测试一般考虑业务逻辑(如购物车业务),要求真实的数据。
  • 基准测试的作用:对于多数Web应用,整个系统的瓶颈在于数据库;原因很简单:Web应用中的其他因素, 例如网络带宽、负载均衡节点、应用服务器(包括CPU、内存、硬盘灯、连接数等)、缓存, 都很容易通过水平的扩展(俗称加机器)来实现性能的提高。而对于MySQL,由于数据一致性的要求, 无法通过增加机器来分散向数据库写数据带来的压力;虽然可以通过前置缓存(Redis等)、读写分离、分库分表来减轻压力, 但是与系统其它组件的水平扩展相比,受到了太多的限制。而对数据库的基准测试的作用, 就是分析在当前的配置下(包括硬件配置、OS、数据库设置等),数据库的性能表现, 从而找出MySQL的性能阈值,并根据实际系统的要求调整配置。

基准测试的指标:

  • 常见的数据库指标包括:
    • TPS/QPS:衡量吞吐量
    • 响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等,其中时间百分比参考意义较大,如前95%的请求的最大响应时间
    • 并发量:同时处理的查询请求的数量

压测实例以及结果解读

  1. cpu测试

    • sysbench –test=cpu –cpu-max-prime=2000000 run
    • cpu测试主要是进行素数的加法运算,指定了最大的质数发生器数量为 2000000
  2. 磁盘IO测试(磁盘的读写IOPS和fsync)

    • sysbench –test=fileio –num-threads=16 –file-total-size=30G –file-test-mode=rndrw prepare
    • sysbench –test=fileio –num-threads=16 –file-total-size=30G –file-test-mode=rndrw run
  3. 线程测试

    • sysbench –test=threads –num-threads=64 –thread-yields=100 –thread-locks=2 run
    • 发送64次/个测试线程请求,每次/个线程请求产生/生成100个数量,每个线程的锁数量为2
  4. 内存测试(执行时间、每秒传输速度)

    • sysbench –test=memory –memory-block-size=8k –memory-total-size=40G run
    • 指定在内存中传输 40G 的数据量,每个 block 大小为 8K

测试结果分析:

SQL statistics:
##queries performed:  #性能统计
read:1994860   #总 select 数量
write: 0       #总update、insert、delete语句数量
other: 284980  #commit、unlock tables以及其他mutex的数量
total: 2279840 #总的执行语句数
transactions:142490 (1186.20 per sec.)  #总的事物数(每秒处理事物数)|通常需要关注的数字(TPS)
queries: 2279840 (18979.13 per sec.)    #读写请求次数(每秒的读写次数)|通常需要关注的数字(QPS)
other operations: 9375 (156.13 per sec.)#其它操作的每秒执行数
ignored errors:0(0.00 per sec.)         #忽略的错误数
reconnects:0(0.00 per sec.)
##General statistics:
total time:120.1216s                    #即time指定的压测总时间
total number of events:142490           #总的事件数,一般与transactions相同
total time taken by event execution: 600.0783s   #所有事务耗时相加(不考虑并行因素)
##response time:    //应答时间
min:8.52
avg:107.84
max:480.08
95th percentile:170.48                  #95%的语句的平均响应时间
sum:15365843.76
##Threads fairness:
events (avg/stddev): 1113.2031/14.76
execution time (avg/stddev): 120.0457/0.04
我们一般关注的指标主要有:
response time avg: 平均响应时间。(后面的95%的大小可以通过–percentile=98的方式去更改)
transactions: 精确的说是这一项后面的TPS 。但如果使用了-skip-trx=on,这项事务数恒为0,需要用total number of events 去除以总时间,得到tps(其实还可以分为读tps和写tps)
queries: 用它除以总时间,得到吞吐量QPS

参考