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的 成绩.
后续工作:
压测工具标准化封装
压测工具自助化
压测数据可视化
微信分享/微信扫码阅读