MySQL基准压测规范

压测要求:

因压测结果与服务器硬件配置、OS版本、I/O调度算法、CPU调度算法、数据库版本、数据库配置、测试工具版本有很大关系,为了使每个DBA的压测数据更客观可比较,需统一压测工具版本、统一OS版本及参数、统一MySQL版本及参数配置、统一和完善压测方法。

压测工具:

OS:

fio:yum install fio

MySQL:

Sysbench: https://github.com/akopytov/sysbench sysbench 1.1.0

Sysbench-tpcc: https://github.com/Percona-Lab/sysbench-tpcc

Oltpbench: https://github.com/oltpbenchmark/oltpbench

压测脚本:

OS:

异步随机读写:

fio --filename=./testfile  -ioengine=libaio -direct=1 -iodepth=32 -rw=randrw -bs=4k -size=64G -numjobs=64 -runtime=60 -group_reporting -name=test-rand-readwrite

异步随机读:

fio --filename=./testfile  -ioengine=libaio  -direct=1 -iodepth=32 -rw=randread -bs=4k -size=64G -numjobs=64 -runtime=60 -group_reporting -name=test-rand-read

异步随机写:

fio --filename=./testfile  -ioengine=libaio -direct=1 -iodepth=32 -rw=randwrite -bs=4k -size=64G -numjobs=64 -runtime=60 -group_reporting -name=test-rand-write

异步顺序读:

fio --filename=./testfile  -ioengine=libaio --direct=1 -iodepth=32 --rw=read  -bs=4k -size=64G -numjobs=4 -runtime=60 --group_reporting --name=test-read

异步顺序写:

fio --filename=./testfile  -ioengine=libaio -direct=1  -iodepth=32 -rw=write -bs=4k -size=64G -numjobs=4  -runtime=60 -group_reporting -name=test-write

或:

sysbench fileio --time=300 --events=0 --threads=XXX --file-num=127 --file-total-size=148G --file-io-mode=sync --file-test-mode=rndwr  --file-block-size=16384 run

sysbench cpu --threads=XXX --time=300  --cpu-max-prime=10000 run

sysbench memory --events=0 --threads=XXX  --memory-block-size=1M  --memory-total-size=100G --memory-scope=global --memory-oper=read --memory-access-mode=rnd run

MySQL:

Sysbench只读:

sysbench --threads=128 --time=1800 --rand-type=uniform --report-interval=5 --db-driver=mysql --mysql-host=XXXX --mysql-user=XXXX --mysql-password=XXXX --tables=100 --table_size=20000000  oltp_read_only  prepare/run/cleanup

Sysbench读写:

sysbench --threads=128 --time=1800 --rand-type=uniform --report-interval=5 --db-driver=mysql --mysql-host=XXXX --mysql-user=XXXX --mysql-password=XXXX --tables=100 --table_size=20000000  oltp_read_write prepare/run/cleanup

Sysbench-tpcc事务压测:

tpcc.lua --mysql-host=XXXX  --mysql-user=XXXX  --mysql-password=XXXX  --mysql-port=XXXX  --mysql-db=sysbench --time=1800 --threads=128 --report-interval=1 --tables=100 --scale=100 --db-driver=mysql  prepare/run/cleanup

压测重要参数:
5.5/5.6:
innodb_buffer_pool_size = 88G
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
innodb_write_io_threads = 16
innodb_read_io_threads = 8
innodb_doublewrite = ON

5.7:
innodb_buffer_pool_dump_at_shutdown=on
innodb_buffer_pool_load_at_startup=on

压测指标:

OS:IOPS\BW\Latency

MySQL:TPS\QPS\Latency

压测方法:

1、通过fio/sysbench压测比较不同线程下OS/MySQL的性能数据差异,找出最大性能的并发线程数

2、依据以往压测经验MySQL数据库在128线程达到最大性能,常规压测主要通过128并发线程压测半小时,连续压测10次,每次压测开始前,都会重启数据库

压测定位案例-case 1:

海外aws美西机器由于linux kernel 版本差异导致的CPU在不同的线程下压测,效能差别很大,自测发现问题并反馈给AWS技术人员,来自AWS的回复信息如下:

1. 在C4.8xlarge 实例上, 使用8个thread的成绩较1个thread的成绩还差.

2. 对比8个thread的测试, r3.2xlarge的成绩优于C4.8xlarge十倍以上.

比对之前使用 CentOS 6.9 的测试结果:

8 thread:

# sysbench --threads=8 --time=60 --test=cpu --cpu-max-prime=1000 run

events per second:  182512.49

我可以发现测试成绩在 CentOS 6.3 及 CentOS 6.9 之间存在有巨大的差异.

因此我尝试将您系统中的 kernel 由 2.6.32-279.23.1.mi5.el6.x86_64 升级至 2.6.32-696.28.1.el6.x86_64 并重新进行测试.

C4.8xlarge (kernel: 2.6.32-696.28.1.el6.x86_64)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1. 1 thread:

# sysbench --threads=1 --time=60 --test=cpu --cpu-max-prime=1000 run

events per second: 25182.09

2. 8 thread:

# sysbench --threads=8 --time=60 --test=cpu --cpu-max-prime=1000 run

events per second: 188099.13

在经过升级 kernel后, 测试结果已能正确反应 C4.8xlarge的性能, 与我使用 CentOS 6.9的测试结果相当, 也优于 R3.2xlarge的 成绩.

后续工作:
压测工具标准化封装
压测工具自助化
压测数据可视化

--------EOF---------
微信分享/微信扫码阅读