对数据库进行基准测试,以掌握数据库的性能情况是非常必要的。因此对数据库的性能指标进行定量的、可复现的、可对比的测试就显得非常的重要。
一、MySQL的基准测试与sysbench
MySQL的基准测试可以理解为是对数据库运行时的一种压力测试。但这样的测试不关心业务逻辑,更加简单、直接、易于测试。测试时使用的数据可以由工具生成,不要求真实。MySQL数据库基准测试时的关键指标包括以下3个方面:
- TPS/QPS:衡量吞吐量。
- 响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等,其中时间百分比参考意义较大,如前95%的请求的最大响应时间。。
- 并发量:同时处理的查询请求的数量。
MySQL利用sysbench基准测试工具可以很好地完成数据库的基准测试工作。sysbench支持多线程的工作,并且能够实现跨平台的安装部署。
视频讲解如下:
二、【实战】安装和使用sysbench
下面通过具体的步骤来演示如何安装sysbench,以及它的基本使用方法。
(1)sysbench可以通过yum方式直接进行安装,执行下面的语句。
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | bash yum -y install sysbench
(2)查看sysbench的版本信息。
sysbench --version # 输出的信息如下: sysbench 1.0.20
(3)查看sysbench的使用帮助。
sysbench --help # 输出的信息如下: Usage: sysbench [options]... [testname] [command]
其中:
- options代表sysbench进行测试时所使用的参数,主要分为通用选项和MySQL专用选项。下表列举了具体的选项名称和它们的含义。
- testname指定了要进行测试的名称。
- command代表sysbench要执行的命令,包括prepare、run和cleanup三个命令:prepare是为测试提前准备数据;run是执行正式的测试;cleanup是在测试完成后对数据库进行清理。
(4)使用sysbench测试服务器的CPU性能 。
sysbench cpu --cpu-max-prime=20000 --threads=2 run
提示:sysbench对CPU的测试主要是进行素数的加法运算进行测试,其中:
--cpu-max-prime: 生成素数的数量上限。
--threads: 启动进行素数计算的线程数。
输出的信息如下:
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Running the test with following options: #指定线程个数 Number of threads: 2 Initializing random number generator from current time #每个线程产生的素数上限为2万个 Prime numbers limit: 20000 Initializing worker threads... Threads started! CPU speed: #所有线程每秒完成了342.47次event events per second: 342.47 General statistics: total time: 10.0052s #共耗时10.0052秒 total number of events: 3427 #在10.0052秒内共完成了3427次event Latency (ms): min: 2.67 #完成1次event最少耗时2.67ms avg: 5.83 #完成所有events平均耗时5.83ms max: 26.00 #完成1次event最大耗时26毫秒 95th percentile: 13.95 #95%的events完成都在13.95ms完成 sum: 19979.50 Threads fairness: #平均每完成1713.5000次event,标准差是3.50 events (avg/stddev): 1713.5000/3.50 #每个线程平均耗时9.9897秒,标准差为0.01event execution time (avg/stddev): 9.9897/0.01
(5)使用sysbench测试磁盘的IOPS,执行下面的语句。
# 准备测试数据 sysbench fileio --file-total-size=1G --file-test-mode=rndrw \ --time=30 --max-requests=0 prepare # 开始测试 sysbench fileio --file-total-size=1G --file-test-mode=rndrw \ --time=30 --max-requests=0 run # 清除测试数据 sysbench fileio --file-total-size=1G --file-test-mode=rndrw \ --time=30 --max-requests=0 cleanup
提示:IOPS是Input/Output Per Second的缩写,即每秒的输入输出量(或读写次数)。它是衡量磁盘性能的主要指标之一。IOPS的计算公式如下:
IOPS = (Throughput read + Throughput written) * 1024 / 16kb
输出的信息如下:
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Running the test with following options: Number of threads: 1 Initializing random number generator from current time Extra file open flags: (none) 128 files, 8MiB each 1GiB total file size Block size 16KiB Number of IO requests: 0 Read/Write ratio for combined random IO test: 1.50 Periodic FSYNC enabled, calling fsync() each 100 requests. Calling fsync() at the end of test, Enabled. Using synchronous I/O mode Doing random r/w test Initializing worker threads... Threads started! File operations: reads/s: 3372.32 writes/s: 2248.21 fsyncs/s: 7195.38 Throughput: read, MiB/s: 52.69 written, MiB/s: 35.13 General statistics: total time: 30.0309s total number of events: 384769 Latency (ms): min: 0.00 avg: 0.08 max: 18.82 95th percentile: 0.31 sum: 29737.74 Threads fairness: events (avg/stddev): 384769.0000/0.00 execution time (avg/stddev): 29.7377/0.00 # 从上面的测试数据可以计算出当前磁盘的IOPS为: IOPS=(52.69+35.13)*1024/16=5620.48
三、【实战】使用sysbench测试MySQL数据库
sysbench提供了相关的lua脚本对数据库的性能进行测试。这些脚本可以在目录“/usr/share/sysbench/”下找到。下面列出了这些lua的脚本。
tree /usr/share/sysbench/ -P *.lua /usr/share/sysbench/ ├── bulk_insert.lua ├── oltp_common.lua ├── oltp_delete.lua ├── oltp_insert.lua ├── oltp_point_select.lua ├── oltp_read_only.lua ├── oltp_read_write.lua ├── oltp_update_index.lua ├── oltp_update_non_index.lua ├── oltp_write_only.lua ├── select_random_points.lua ├── select_random_ranges.lua └── tests ├── include │ ├── inspect.lua │ └── oltp_legacy │ ├── bulk_insert.lua │ ├── common.lua │ ├── delete.lua │ ├── insert.lua │ ├── oltp.lua │ ├── oltp_simple.lua │ ├── parallel_prepare.lua │ ├── select.lua │ ├── select_random_points.lua │ ├── select_random_ranges.lua │ ├── update_index.lua │ └── update_non_index.lua └── t
下面通过具体的步骤来演示如何使用sysbench提供的lua脚本测试MySQL数据库。视频讲解如下:
(1)创建测试数据库sysbenchdemo。
mysql -hlocalhost -P3306 -uroot -pWelcome_1 \ -e 'create database sysbenchdemo'
(2)准备测试数据。
sysbench /usr/share/sysbench/oltp_insert.lua \ --mysql-host=localhost \ --mysql-port=3306 \ --mysql-socket=/tmp/mysql.sock \ --mysql-user=root \ --mysql-password=Welcome_1 \ --mysql-db=sysbenchdemo \ --db-driver=mysql \ --tables=5 \ --table-size=100000 \ --time=180 prepare
提示:这调用了sysbench提供的脚本“/usr/share/sysbench/oltp_insert.lua”创建了5张表,并且往每张表中插入了100000条记录。
输出的信息如下:
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Creating table 'sbtest1'... Inserting 100000 records into 'sbtest1' Creating a secondary index on 'sbtest1'... Creating table 'sbtest2'... Inserting 100000 records into 'sbtest2' Creating a secondary index on 'sbtest2'... Creating table 'sbtest3'... Inserting 100000 records into 'sbtest3' Creating a secondary index on 'sbtest3'... Creating table 'sbtest4'... Inserting 100000 records into 'sbtest4' Creating a secondary index on 'sbtest4'... Creating table 'sbtest5'... Inserting 100000 records into 'sbtest5' Creating a secondary index on 'sbtest5'...
(3)开始进行测试。
sysbench /usr/share/sysbench/oltp_insert.lua \ --mysql-host=localhost \ --mysql-port=3306 \ --mysql-socket=/tmp/mysql.sock \ --mysql-user=root \ --mysql-password=Welcome_1 \ --mysql-db=sysbenchdemo \ --db-driver=mysql \ --tables=5 \ --table-size=100000 \ --time=180 run # 输出的信息如下: sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Running the test with following options: Number of threads: 1 Initializing random number generator from current time Initializing worker threads... Threads started! SQL statistics: queries performed: read: 0 # 总的写次数 write: 175062 other: 0 total: 175062 # 总的事务数和每秒事务数 transactions: 175062 (972.55 per sec.) queries: 175062 (972.55 per sec.) ignored errors: 0 (0.00 per sec.) reconnects: 0 (0.00 per sec.) General statistics: # 总的执行时间和事件数 total time: 180.0014s total number of events: 175062 # 延时的统计信息 Latency (ms): min: 0.62 avg: 1.02 max: 94.24 95th percentile: 1.58 sum: 179185.02 Threads fairness: events (avg/stddev): 175062.0000/0.00 execution time (avg/stddev): 179.1850/0.00
(4)清理测试数据。
sysbench /usr/share/sysbench/oltp_insert.lua \ --mysql-host=localhost \ --mysql-port=3306 \ --mysql-socket=/tmp/mysql.sock \ --mysql-user=root \ --mysql-password=Welcome_1 \ --mysql-db=sysbenchdemo \ --db-driver=mysql \ --tables=5 \ --table-size=100000 \ --time=180 cleanup