关于MySQLslap压测工具----MySQL自带的也测工具
官方文档解释:
http://dev.mysql.com/doc/refman/5.1/en/mysqlslap.html
mysqlslap — Load Emulation Client
mysqlslap is a diagnostic program designed to emulate client load for a MySQL server and to report the timing of each stage. It works as if multiple clients are accessing the server.
Invoke mysqlslap like this:
shell> mysqlslap [options]
Some options such as --create
or --query
enable you to specify a string containing an SQL statement or a file containing statements. If you specify a file, by default it must contain one statement per line. (That is, the implicit statement delimiter is the newline character.) Use the --delimiter
option to specify a different delimiter, which enables you to specify statements that span multiple lines or place multiple statements on a single line. You cannot include comments in a file; mysqlslap does not understand them.
--concurrency 并发数量
--engines 要测试的引擎
--iterations 运行测试多少次。
--auto-generate-sql 用系统自己生成的SQL脚本来测试。
--auto-generate-sql-load-type 要测试的是读还是写还是两者混合的(read,write,update,mixed)
--number-of-queries 总共要运行多少次查询
--debug-info 代表要额外输出CPU以及内存的相关信息。
--number-int-cols : 创建测试表的 int 型字段数量
--auto-generate-sql-add-autoincrement : 代表对生成的表自动添加auto_increment列,从5.1.18版本开始
--number-char-cols 创建测试表的 char 型字段数量。
--create-schema 测试的schema,MySQL中schema也就是database。
--query 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
--only-print 如果只想打印看看SQL语句是什么,可以用这个选项。
测试过程:
######################################################################################################
一.准备环境
1.1 环境如下:
######################################################################################################
RDS: 48G 100G
主实例:drds_xncs_master 10.3.244.2 物理机ip:10.3.162.244
只读实例:
drds_xncs_readonly_1 drds_xncs_master 10.3.224.68 物理机ip:10.3.162.156
drds_xncs_readonly_2 drds_xncs_master 10.3.225.153 物理机ip:10.3.162.206
drds_xncs_readonly_3 drds_xncs_master 10.3.224.74 物理机ip:10.3.162.216
drds_xncs_readonly_4 drds_xncs_master 10.3.224.3 物理机ip:10.3.162.200
drds_xncs_readonly_5 drds_xncs_master 10.3.231.6 物理机ip:10.3.162.239
DRDS: 64C 128G
drds_xncs_bic_cs 10.3.244.137
ECS:16C 64G
ecs_xncs_cs_1 10.3.244.148 192.168.130.115
ecs_xncs_cs_2 10.3.244.149 192.168.35.24
ecs_xncs_cs_3 10.3.244.150 192.168.36.52
#########################################################################################################
1.2 创建测试表:
在DRDS建立非分库分表的测试表:
CREATE TABLE `bic_base_org` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '组织机构id',
`inst_id` bigint(20) DEFAULT NULL COMMENT 'ERP机构表唯一标识,根据INST_ID来识别是否新增或更新机构信息',
`code` varchar(20) DEFAULT NULL COMMENT '机构唯一标识代码,需符合编码规则',
`name_cn` varchar(200) DEFAULT NULL COMMENT '中文名称',
`aic_register_name` varchar(200) DEFAULT NULL COMMENT '机构的工商注册名称',
`postcode` varchar(20) DEFAULT NULL COMMENT '类型允许为空值,开发、测试、uat都要更改',
`administrative_division` varchar(20) DEFAULT NULL COMMENT '机构的国家标准行政区域代码,6位编码',
`province_code` varchar(20) DEFAULT NULL COMMENT '省行政区划编码',
`city_code` varchar(50) DEFAULT NULL COMMENT '地市行政区划编码',
`status` varchar(20) NOT NULL COMMENT '标示组织机构的生效/失效状态',
`business_unit` varchar(20) NOT NULL COMMENT '标示该机构归属:邮政,速递',
`org_level` varchar(20) NOT NULL COMMENT '标示机构所属层级:集团、板块总部、省分公司、地市(州)分公司、区县(旗)分公司、支局(所、网点)',
`org_category` varchar(20) DEFAULT NULL COMMENT '标示机构所属分类:营业、大宗收寄、网运、投递、集邮、分销、报刊、代理速递',
`manage_level` varchar(20) DEFAULT NULL COMMENT '标示机构机构管控级别:一体化专业、一体化现业、非一体化',
`parent_org_code` varchar(20) DEFAULT NULL COMMENT '上级机构的机构代码,需符合编码规则',
`erp_parent_org_code` varchar(20) DEFAULT NULL COMMENT 'erp上级行政机构代码',
`distribution_org_flag` varchar(20) DEFAULT NULL COMMENT '一级中心局/二级中心局/三级中心局/市邮件处理中心/县邮件处理中心/不适用。速递无需此字段;邮务需此字段。',
`legal_entity_flag` char(1) DEFAULT NULL COMMENT '机构是否为法人单位',
`address` varchar(200) DEFAULT NULL COMMENT '机构地址',
`approve_create_date` datetime DEFAULT NULL COMMENT '机构批准成立日期',
`source_org_create_date` datetime DEFAULT NULL COMMENT '源系统机构创建日期',
`major` varchar(20) DEFAULT NULL COMMENT '组织机构所处专业',
`org_phase` varchar(20) DEFAULT NULL COMMENT '组织机构所处环节',
`main_category` varchar(20) DEFAULT NULL COMMENT '管理机构:总部、省公司、总部直管单位、省管单位、地市公司、地市管单位;生产机构:速递物流揽投机构、邮件处理机构、客户服务机构、电商与物流生产机构、运输类机构、挂靠类机构;其他邮务无需此字段',
`detail_category` varchar(20) DEFAULT NULL COMMENT 'A:管理机构: 1.总部:总部下级 2.省公司:省公司 \n3.总部直管单位:总部直管区域分公司,总部直管子公司,总部直管控股公司,总部直管海外公司、总部直管全国性邮件处理中心 \n4.地市公司:地市公司 \n5.省管单位:省直属专业分公司、省直属邮件处理中心、省直属营业部、省管区域分公司、省管地市区域一体化公司、省直管计划单列县、省管长期投资股权公司、其他省管机构 6.地市管单位:地市直属专业分公司、地市直属邮件处理中心、地市管区域分公司、地市管县营业部、地市管长期投资股权公司,其他地市直属机构,其他地市管机构,其他地市直属管理中心 B:生产机构:在生产机构大类基础上细化的分类。\n1.速递物流揽投:A、B、C、D\n2.邮件处理:1级、2级、3级\n3.客服服务:区域客户服务中心\n4.电商与物流生产:电商与物流业务项目组、供应链管理中心\n5.运输:运输公司、运输队\n6.挂靠:大客户营销中心,调度室,客户服务中心(本地性),财务共享中心,网运支撑中心\n邮务无需此字段',
`business_function` varchar(50) DEFAULT NULL COMMENT '类型允许为空值,开发、测试、uat都要更改',
`core` varchar(20) DEFAULT NULL COMMENT '1城市核心,2城市非核心,3辖县核心,4辖县非核心\n邮务无需此字段',
`corporation_flag` char(1) DEFAULT NULL COMMENT '值为是或否',
`department_flag` char(1) DEFAULT NULL COMMENT '值为是或否',
`company_code` varchar(20) DEFAULT NULL COMMENT '是否部门项为是的才有所属公司',
`company_name` varchar(200) DEFAULT NULL COMMENT '财务-所属公司名称',
`common_service` char(1) DEFAULT NULL COMMENT '机构是否适用于普遍服务',
`branch_emp_relationship` varchar(20) DEFAULT NULL COMMENT '代办/自办/不适用。邮务需此字段;速递无需此字段。',
`branch_urban_type` varchar(20) DEFAULT NULL COMMENT '城市/农村/不适用。速递无需此字段;邮务需此字段。',
`branch_func_type` varchar(20) DEFAULT NULL COMMENT '纯邮政/综合/纯金融/不适用。速递无需此字段;邮务需此字段',
`branch_invest_type` varchar(20) DEFAULT NULL COMMENT '营业/营投合一/投递/不适用。速递无需此字段;邮务需此字段。',
`erp_branch_invest_type` varchar(20) DEFAULT NULL COMMENT 'ERPERP网点营投类型, 开发、测试、UAT、生产都要添加',
`create_date` datetime DEFAULT NULL COMMENT 'ERP系统记录的创建时间',
`modify_date` datetime DEFAULT NULL COMMENT 'ERP系统记录的最后更新时间',
`create_user_id` bigint(20) DEFAULT NULL COMMENT '创建人id',
`gmt_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify_user_id` bigint(20) DEFAULT NULL COMMENT '修改人id',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`is_deleted` char(1) DEFAULT '0' COMMENT '是否删除:\n0:否\n1:是',
PRIMARY KEY (`id`),
KEY `idx_parent_org_code` (`parent_org_code`),
KEY `idx_code` (`code`),
KEY `idx_name_cn` (`name_cn`),
KEY `idx_business_unit` (`business_unit`)
) ENGINE=InnoDB AUTO_INCREMENT=191001 DEFAULT CHARSET=utf8 COMMENT='组织机构基础信息(ERP)';
1.3 导入测试数据(从生产全部导出并导入)
mysql -udrds_xncs_bic_cs -p -h10.3.244.137 -P3306 drds_xncs_bic_cs < rds_jdsc_bic_bic_base_org_insert.sql
1.4 查看表大小
mysql> select count(*) from bic_base_org;
+----------+
| count(*) |
+----------+
| 191087 |
+----------+
1 row in set (0.03 sec)
1.5 查看数据
mysql> select id,inst_id,code,name_cn,aic_register_name,postcode,administrative_division,province_code,city_code,status,business_unit,org_level,org_category,manage_level,parent_org_code,erp_parent_org_code from bic_base_org where id=170000;
+--------+---------+----------+--------------------------------------------------------------------+-------------------+----------+-------------------------+---------------+-----------+--------+---------------+-----------+--------------+--------------+-----------------+---------------------+
| id | inst_id | code | name_cn | aic_register_name | postcode | administrative_division | province_code | city_code | status | business_unit | org_level | org_category | manage_level | parent_org_code | erp_parent_org_code |
+--------+---------+----------+--------------------------------------------------------------------+-------------------+----------+-------------------------+---------------+-----------+--------+---------------+-----------+--------------+--------------+-----------------+---------------------+
| 170000 | 245313 | 54310302 | 中国邮政储蓄银行股份有限公司苍梧县新地营业所 | NULL | 543103 | 450421 | 45 | 4504 | 0 | A | 06 | NULL | NULL | 54316100 | 54316100 |
+--------+---------+----------+--------------------------------------------------------------------+-------------------+----------+-------------------------+---------------+-----------+--------+---------------+-----------+--------------+--------------+-----------------+---------------------+
1 row in set (0.01 sec)
1.6 执行计划
mysql> explain select id,inst_id,code,name_cn,aic_register_name,postcode,administrative_division,province_code,city_code,status,business_unit,org_level,org_category,manage_level,parent_org_code,erp_parent_org_code from bic_base_org where id=170000;
+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+
| GROUP_NAME | SQL | PARAMS |
+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+
| DRDS_XNCS_BIC_CS_1513840820139DMOXDRDS_XNCS_BIC_CS_CJWT_0000_RDS | select id,inst_id,code,name_cn,aic_register_name,postcode,administrative_division,province_code,city_code,status,business_unit,org_level,org_category,manage_level,parent_org_code,erp_parent_org_code from bic_base_org where id=170000 | {} |
+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+
1 row in set (0.00 sec)
mysql> explain execute select id,inst_id,code,name_cn,aic_register_name,postcode,administrative_division,province_code,city_code,status,business_unit,org_level,org_category,manage_level,parent_org_code,erp_parent_org_code from bic_base_org where id=170000;
+----+-------------+--------------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | bic_base_org | const | PRIMARY | PRIMARY | 8 | const | 1 | NULL |
+----+-------------+--------------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.01 sec)
可以看到 ,在0号db上执行,并且执行计划是主键查询,最快的方式
############################################################################################################################################
二.测试语句
2.1 测试语句:
vi hebin_select.sql
select id,inst_id,code,name_cn,aic_register_name,postcode,administrative_division,province_code,city_code,status,business_unit,org_level,org_category,manage_level,parent_org_code,erp_parent_org_code from bic_base_org where id=170000;
2.2 测试工具:
mysqlslap
#############################################################################################################################################
三.开始测试
3.1 DRDS上测试(把其中一个slave读设100% 测drds下 一个备库 ) 100并发 总共跑 1千万条相同的主键查询:
mysqlslap --query=/home/hebin/hebin_select.sql --concurrency=100 --number-of-queries=10000000 --iterations=1 --create-schema=drds_xncs_bic_cs --engine=innodb -h10.3.244.137 -udrds_xncs_bic_cs -p
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 235.556 seconds
Minimum number of seconds to run all queries: 235.556 seconds
Maximum number of seconds to run all queries: 235.556 seconds
Number of clients running queries: 100
Average number of queries per client: 100000
3.2 RDS上主库测试 100并发 总共跑 1千万条相同的主键查询:
mysqlslap --query=/home/hebin/hebin_select.sql --concurrency=100 --number-of-queries=10000000 --iterations=1 --create-schema=drds_xncs_bic_cs_trou_0000 --engine=innodb -h10.3.244.2 -udrds_xncs_master -p
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 154.738 seconds
Minimum number of seconds to run all queries: 154.738 seconds
Maximum number of seconds to run all queries: 154.738 seconds
Number of clients running queries: 100
Average number of queries per client: 100000
qps=10000000/154.738=64625.3667489563
3.3 RDS上其中一个只读库测试 100并发 总共跑 1千万条相同的主键查询:
mysqlslap --query=/home/hebin/hebin_select.sql --concurrency=100 --number-of-queries=10000000 --iterations=1 --create-schema=drds_xncs_bic_cs_trou_0000 --engine=innodb -h10.3.225.153 -udrds_xncs_master -p
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 150.370 seconds
Minimum number of seconds to run all queries: 150.370 seconds
Maximum number of seconds to run all queries: 150.370 seconds
Number of clients running queries: 100
Average number of queries per client: 100000
qps=10000000/150.370=66502.62685376072
3.4 DRDS上测试(5个只读每个开20%) 100并发 总共跑 1千万条相同的主键查询:
mysqlslap --query=/home/hebin/hebin_select.sql --concurrency=100 --number-of-queries=10000000 --iterations=1 --create-schema=drds_xncs_bic_cs --engine=innodb -h10.3.244.137 -udrds_xncs_bic_cs -p
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 216.412 seconds
Minimum number of seconds to run all queries: 216.412 seconds
Maximum number of seconds to run all queries: 216.412 seconds
Number of clients running queries: 100
Average number of queries per client: 100000
qps=10000000/216.412=46208.15851246696
3.5 DRDS上测试(5个只读每个开20%) 1000并发 总共跑 1亿条相同的主键查询:
mysqlslap --query=/home/hebin/hebin_select.sql --concurrency=1000 --number-of-queries=100000000 --iterations=1 --create-schema=drds_xncs_bic_cs --engine=innodb -h10.3.244.137 -udrds_xncs_bic_cs -p
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 1790.584 seconds
Minimum number of seconds to run all queries: 1790.584 seconds
Maximum number of seconds to run all queries: 1790.584 seconds
Number of clients running queries: 1000
Average number of queries per client: 100000
qps 大约 100000000/1790=55865.9217877095
*****以上数据考虑到单台ECS性能并发量的局限性,于是采用多台ECS并发测试,通过DRDS和RDS控制台观察数据***************************
3.6 DRDS上测试(5个只读每个开20%) 共10000并发,两个ECS执行分别5000 总共跑 20亿条相同的主键查询:
mysqlslap --query=/tmp/huayu.sql --concurrency=5000 --number-of-queries=1000000000 --iterations=1 --create-schema=drds_xncs_bic_cs --engine=innodb -h10.3.244.137 -udrds_xncs_bic_cs -p
物理RT:1.1ms左右
DRDS:QPS:大约125000左右
RDS上SQL的执行时间:100微秒左右
3.7 DRDS上测试(5个只读每个开20%) 共15000并发,三个ECS执行分别5000 总共跑 30亿条相同的主键查询:
DRDS:QPS:大约210000左右
RDS上SQL的执行时间:100微秒左右
物理RT:2.1ms左右
3.8 RDS上测试(5个只读每个开20%) 共1500并发,两个ECS执行分别1000,500 总共跑 20亿条相同的主键查询:
mysqlslap --query=/tmp/huayu.sql --concurrency=1000 --number-of-queries=1000000000 --iterations=1 --create-schema=drds_xncs_bic_cs --engine=innodb -h10.3.244.137 -udrds_xncs_bic_cs -p
连接数:75%(1500),RDS最大连接数为2000.
RDS:QPS:接近70000
CPU:接近100%
SQL的执行时间:几百-几万微妙
ECS的网络:已经接近瓶颈
3.9 RDS上测试(5个只读每个开20%) 共1900并发,三个个ECS执行分别1000,500,400 总共跑 30亿条相同的主键查询
连接数:1900.
RDS:QPS:接近70000
Cpu:接近100%
SQL的执行时间:几百-几万微妙
RDS的QPS已经到达极限
ECS的网络:接近瓶颈
################################################################################################################
四.测试总结:
单台ECS相对并发量较低的测试:
1.RDS 只读库和主库 性能基本相同
2.单独开一个只读的 DRDS 耗时比 单rds写库或者单rds只读库 相差较大 154/235 = 65% 大约损失35%的性能
3.开满5个只读的 DRDS 耗时比 单rds写库或者单rds只读库 相差较大 154/216 = 71% 大约损失29%的性能
4.单rds的qps是6w6左右,最高性能的drds提高并发后最多达到5w5左右 所以 17% 左右的性能损耗
多台ECS,高并发量,DRDS、RDS最大吞吐量测试:
5.DRDS开满5个只读实例,三台ECS到达15000的并发,DRDS的QPS可以达到210000左右
6.RDS主实例开5个只读实例,两台ECS接近75%(1500)的并发,RDS的QPS可以接近70000。再次提高并发数QPS已经没有提升。可见主实例RDS规格48G内存128G磁盘的最大QPS接近70000。