背景
成为一名合格的DBA,你必须要知道的事情是:如何评估一套MySQL的性能,如何得到MySQL的最大QPS。
为了确认好这两点,我们需要借助测试工具:TPCC-MySQL。
基础环境说明
操作系统:SUSE Linux Enterprise Server 11
CPU型号:Intel(R) Xeon(R) CPU E5-2658 0 @ 2.10GHz
CPU线程数:8
内存容量:24G
MySQL版本:5.5.29-log MySQL Community Server (GPL)
工具安装
1、服务器具备root权限,编译好make,gcc源码包。
2、准备好MySQL的源码文件,并进行编译安装(下载地址:http://dev.mysql.com/downloads/mysql/5.6.html,选择Source Code)
3、TPCC-mysql文件:见附件。
1、进入src目录
LVS-BACKUP:/tmp/tpcc-mysql # cd src/
LVS-BACKUP:/tmp/tpcc-mysql/src # ls
Makefile driver.c main.c ordstat.c payment.c rthist.h sequence.h spt_proc.c support.c trans_if.h
delivery.c load.c neword.c parse_port.h rthist.c sequence.c slev.c spt_proc.h tpc.h
2、修改Makefile,全路径指定mysql_config
LVS-BACKUP:/tmp/tpcc-mysql/src # vim Makefile
#
# "make all" to build necessary executables.
#
LIBS= `/usr/local/mysql/bin/mysql_config --libs_r` -lrt
INC= -I. `/usr/local/mysql/bin/mysql_config --include`
3、执行make命令安装tpcc
LVS-BACKUP:/tmp/tpcc-mysql/src # make
cc -w -O2 -g -I. `/usr/local/mysql/bin/mysql_config --include` -c load.c
cc -w -O2 -g -I. `/usr/local/mysql/bin/mysql_config --include` -c support.c
cc load.o support.o `/usr/local/mysql/bin/mysql_config --libs_r` -lrt -o ../tpcc_load
...
cc -w -O2 -g -I. `/usr/local/mysql/bin/mysql_config --include` -c slev.c
cc main.o spt_proc.o driver.o support.o sequence.o rthist.o neword.o payment.o ordstat.o delivery.o slev.o `/usr/local/mysql/bin/mysql_config --libs_r` -lrt -o ../tpcc_start
4、第3步OK后,检查上一层目录是否生成可执行文件:tpcc_load和tpcc_start。
5、添加软链接。
LVS-BACKUP:/tmp/tpcc-mysql # ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/
压测实施
1、原理简介
主要通过预先准备好的建表语句(create_table.sql)及索引语句(add_fkey_idx.sql)来初始化数据库;
然后通过程序tpcc_load来生成数据,通过tpcc_start模拟不同的INSERT,UPDATE,DELETE,SELECT场景来压测,最后根据统计的结果来判断MySQL的性能。
2、初始化脚本
LVS-BACKUP:/tmp/tpcc-mysql # mysql
Server version: 5.5.29-log MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database tpcc default charset utf8;
Query OK, 1 row affected (0.00 sec)
mysql> use tpcc
Database changed
mysql> source ./create_table.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
。。。省略其他
mysql> source ./add_fkey_idx.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
。。。省略其他
3、初始化数据
sh -x load.sh tpcc 1
说明:tpcc为新创建的库名,1为程序中WHILE循环的最大值,用于控制并发线程数。该过程会持续2个小时。完成后,简单统计各表的数据量如下:
mysql> select table_name,table_rows from information_schema.tables where table_schema='tpcc';
+------------+------------+
| table_name | table_rows |
+------------+------------+
| customer | 3016755 |
| district | 977 |
| history | 3000239 |
| item | 100256 |
| new_orders | 1003675 |
| order_line | 30567573 |
| orders | 2737577 |
| stock | 10009497 |
| warehouse | 100 |
+------------+------------+
9 rows in set (0.01 sec)
4、启动压测
LVS-BACKUP:/tmp/tpcc-mysql # ./tpcc_start -h 127.0.0.1 -P 3306 -dtpcc -w100 -c100 -r10 -l500 (参数说明: -d用于指定库名称,-w用于指定随机仓库数量(warehouse表的数据量) -c用于指定并发的线程数量 -r用于指定数据预热时间 -l用于指定程序执行时间)
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
...
MEASURING START.
10, 166(0):2.151|3.090, 155(0):0.606|0.654, 15(0):0.262|0.278, 15(0):2.691|2.744, 17(0):6.593|7.064
...
500, 141(0):2.459|2.555, 146(0):0.629|0.716, 12(0):0.308|0.325, 11(0):3.116|3.165, 14(0):6.835|6.848
STOPPING THREADS....................................................................................................
<Raw Results>
[0] sc:7092 lt:0 rt:0 fl:0
[1] sc:7087 lt:0 rt:0 fl:0
[2] sc:708 lt:0 rt:0 fl:0
[3] sc:704 lt:0 rt:0 fl:0
[4] sc:711 lt:0 rt:0 fl:0
in 500 sec.
<Raw Results2(sum ver.)>
[0] sc:7094 lt:0 rt:0 fl:0
[1] sc:7088 lt:0 rt:0 fl:0
[2] sc:708 lt:0 rt:0 fl:0
[3] sc:705 lt:0 rt:0 fl:0
[4] sc:711 lt:0 rt:0 fl:0
<Constraint Check> (all must be [OK])
[transaction percentage]
Payment: 43.47% (>=43.0%) [OK]
Order-Status: 4.34% (>= 4.0%) [OK]
Delivery: 4.32% (>= 4.0%) [OK]
Stock-Level: 4.36% (>= 4.0%) [OK]
[response time (at least 90% passed)]
New-Order: 100.00% [OK]
Payment: 100.00% [OK]
Order-Status: 100.00% [OK]
Delivery: 100.00% [OK]
Stock-Level: 100.00% [OK]
<TpmC>
851.040 TpmC
5、结果分析
我们取出第4步的如下内容做分析:
1、格式如:10, 166(0):2.151|3.090, 155(0):0.606|0.654, 15(0):0.262|0.278, 15(0):2.691|2.744, 17(0):6.593|7.064
该值中共有6列,都以逗号分隔。每一列的含义是:
第1列:第n轮10s。
第2列:总成功执行的SQL次数(总推迟执行的SQL次数):90%事务的响应时间|本轮测试最大响应时间
第3列:新订单业务成功执行次数(推迟执行次数):90%事务的响应时间|本轮测试最大响应时间
第4列:支付业务的结果,后面几个的意义同上
第5、6列:发货和库存的结果。
一般关注第2列数据。
2、格式如:
<Raw Results>
[0] sc:7092 lt:0 rt:0 fl:0 ( 值意义:New-Order业务成功(success,简写sc)次数,延迟(late,简写lt)次数,重试(retry,简写rt)次数,失败(failure,简写fl)次数 )
[1] sc:7087 lt:0 rt:0 fl:0( 支付业务 )
[2] sc:708 lt:0 rt:0 fl:0( 订单状态 )
[3] sc:704 lt:0 rt:0 fl:0( 发货业务统计 )
[4] sc:711 lt:0 rt:0 fl:0( 库存业务 )
in 500 sec.
3、格式如
[transaction percentage]
Payment: 43.47% (>=43.0%) [OK]
Order-Status: 4.34% (>= 4.0%) [OK]
Delivery: 4.32% (>= 4.0%) [OK]
Stock-Level: 4.36% (>= 4.0%) [OK]
[response time (at least 90% passed)] (呵呵,我认为至少需要99%以上通过才行)
4、最终的TpmC,用于衡量MySQL的整体性能。(该值代表TPC-C的吞吐量,按有效TPC-C配置期间每分钟处理的平均交易次数测量)
<TpmC>
851.040 TpmC
后续优化
1、后续需要通过压测的线程数、压测时间来检查最终结果。时间越长,说服力越强。
2、验证MySQL不同的版本对应的压测结果,找出最优的版本,作为后续现网的选型标准。
2、同一MySQL版本下,通过调整InnoDB参数:innodb_buffer_pool_size innodb_flush_log_at_trx_commit来寻找最佳配置。
参考:
http://blog.itpub.net/29254281/viewspace-1195589
http://17173ops.com/2014/10/12/tpcc-mysql-full-user-manual.shtml |