1、前言
在性能测试中,不论是被测数据库的数据基数以及测试过程中依赖的测试文件,还是为了避免数据热点问题,往往需要构造大量的测试数据,而数据的构造很耗时,影响测试进度。原有的数据构造方式,往往是通过在shell脚本中构造循环实现数据构造,然而shell脚本中的语句是顺序执行的,效率很低,无法满足紧急的性能测试的数据量需求,因此很有必要对原有的数据构造方式进行改造。
Jmeter是性能测试中常用的并发测试工具,既然可以实现并发,因此我们可以考虑将jmeter并发能力应用于数据构造中,在各数据库可以接受的范围内,并发插入数据,减小了手工干预的过程,提高数据构造的效率。
另外,对于mysql和oracle数据库的数据构造可以通过编写存储过程和采用datafactory工具的方式来实现,这一部分在第五章和第六章中分别说明。
2、需求提取分析
对性能测试活动中的数据构造需求进行总结分析,需求见下表:

现将以上需求分别进行说明和分析:
1、hdfs上大量文件数据构造;
2、需实现hive大表的创建。需要抽象出hive表的接口、hive节点的ip、端口、可执行的sql语句。通过这种方式可实现大量表的创建、执行表的拷贝可变向实现多表的创建、执行查询语句可变向实现数据结果的校验;
3、linux上某目录下大量小文件创建。原有的方式是采用split大文件的方法,现在考虑通过jmeter并发调用shell进行拷贝实现;
4、生成linux大文件。原有的方式是通过循环追加的方式生成(封装jar包,提供给jmeter使用。实现可按照选择数据类型随机生成,是否可实现多线程。);
5、hbase大表的生成;
6、mysql上构造表,抽取ip、端口、sql语句;通过这种方式可实现大量表的创建、执行表的拷贝可变向实现多表的创建、执行查询语句可变向实现数据结果的校验;
7、oracle上构造表,抽取ip、端口、sql语句;通过这种方式可实现大量表的创建、执行表的拷贝可变向实现多表的创建、执行查询语句可变向实现数据结果的校验;
3、实验硬件环境说明
下图为oracle数据库以及mysql数据库所在的软硬件环境说明:

数据插入过程中,并未停止数据基础平台以及咪咕数据集市其他进程的运行,因此插入的效率可能有一点影响。
4、通过jmeter构造数据的效率
4.1 Mysql数据插入
4.1.1 成效
因mysql的连接池默认为100,分别对连接池为15、80、100进行了测试。表的字段采用两个字段时(int,varchar(30)),一共设定了5分钟的并发时间,详情如下表。

由以上数据可见,插入的效率与网络有很大原因,在集群内采用一台jmeter机器可实现mysql 百万行数据5分钟之内插入,千万行数据50分钟插入。保守估计相比原先采用脚本插入提升数10倍以上。其中上表中jmeter位于集群内的数据可以看出,在连接池数量不变的情况下,插入的记录数与jmeter的并发数相差不大。
表的字段采用11个字段时,测试效率如下:

通过以上两个表格的对比可以看出表的字段数的影响对于jmeter插入数据的效率有一定影响,但是在可接受的范围内,在集群里jmeter并发五分钟同样可以构造百万行数据。
4.2 ORACLE数据插入
4.2.1 成效
设定jmeter运行5分钟,详细如下表。

在集群内采用一台jmeter机器可实现oracle 百万行数据5分钟之内插入,千万行数据50分钟插入。保守估计相比原先采用脚本插入同样提升数10倍以上。
表的字段采用11个字段时:

通过以上两个表格的对比可以看出表的字段数的影响对于jmeter插入数据的效率影响不大。
4.3 HDFS数据插入
对于HDFS上文件的需求,往往需要构造数据多的小文件。

采用脚本构造原始数据,花了3小时完成了2500个数据的循环拷贝,效率很慢,后期考虑同样利用jmeter的方式调度Hadoop的接口进行数据构造,但是由于现在的集群环境上采用了Kerbors认证,暂未实现该功能。
4.4 HBASE数据插入
待更新
4.5 HIVE数据插入
待更新
4.6 LINUX数据大文件生成
通过将mysql中生成的表导出,并选择字段分割符,28万行记录数导出的记录17s,生成的文件的大小为65M。Oracle导出216M文件花费183s,1G文件花费14分钟。
5. 存储过程
存储过程是由一些SQL语句组成的代码块,这些sql组合起来完成某些业务数据的添加,目前存储过程用的比较多的是关系型数据库mysql、oracle、sql server、db2等常用的数据库。
存储过程与客户端批量插入数据时的效率方面的不同点如下:
1、因为存储过程是存放在数据库的服务器端,相较于客户端的连接方式,少了网络通信的部分。
2、在批量写入数据量的大小方面,目前由于测试时间有限,只测试了插入相同数量的数据时存储过程和datafactory的效率比较。
3、通过jmeter插入业务数据时各表间的关系不是必须项,但是通过存储过程插入数据时是需要了解相关联的表之间的关系的,这需要与相关人员沟通了解相应的业务和设计。
5.1. Mysql数据插入
通过本次实践:当被插入的数据库表字段为2个与11个字段时,数据插入的效率没有明显的变化。
5.1.1 方法
Mysql 存储过程sql语句如下:
create procedure addtestdata(beginorderbigint,endorder bigint)
begin
declarei bigint;
declarej bigint;
declare tempstr varchar(24);
seti= beginorder;
while i <= endorder do
//namestr字段值字符串拼接
settempstr=concat('20011000'+convert((27262024+j),char(8)));
Insertinto testprocperform(id, namestr) values(i,tempstr);
seti=i+1;
endwhile;
end;
5.1.2 成效
下表对比jmeter和存储过程方式的效率差异:
数据库表有2个字段,namestr字段数据为24位的固定字符串:
测试环境消耗时间字段个数连接池数据插入条数

数据库表有11个字段,除了id字段以外其余字段都是数据为60位以内的字符串:

可以看出通过jmeter插入数据比存储过程效率高很多。
5.2. Oracle数据插入
5.2.1方法
Oracle存储过程
create or replace procedure addoracledata(firstNumIN NUMBER, secondNum IN NUMBER) as
inumber;
jnumber;
Tmpnamestrnvarchar2(24);
begin
i:=firstNum;
tmpindex := 0;
while i < secondNum loop begin
//随机字符串生成
select dbms_random.string('X',24) into Tmpnamestr from dual;
/hint(/*...*/)表示插入数据的时候
insert /*+ APPEND NOLOGGING*/ into testprocperform(id,namestr)
values (i,Tmpnamestr);
tmpindex :=tmpindex+1;
if tmpindex =1000 then
commit;
tmpindex := 0;
end if;
i:= i +1;
end loop;
commit;
end addoracledata;
Create or replace procedure insertdata(finIN NUMBER, fend IN NUMBER) as
BEGIN
Insert into PROCPERFORMDB values(fin, ‘GRKJGKRLEKHKJSJDSK’);
COMMIT;
END;
5.2.2 成效
待更新
6.Datafactory
6.1Mysql数据插入
6.1.1 方法
1、安装odbc驱动,虚拟桌面需要安装odbc 32位版本,64位版本当前安装的版本;
2、mysql中建测试数据库和测试用表;
3、使用datafactory创建连接,对表中每个字段插入的数据内容要求进行设置;

图一选择连接类型为odbc

图二选择已有的datasource

图三选择或者添加odbc数据源

图四设置需要添加数据的表中每个字段的数据值类型
4、设置需要插入的数据条数,然后执行;

在插入数据之前设置需要插入数据的量,即记录数。
5、点击run执行;
6.1.1 成效
此测试环境mysql的连接池默认为100,下表对比jmeter和datafactory方式的效率差异:
数据库表有2个字段,namestr字段数据为24位的固定字符串:
测试环境消耗时间字段个数连接池数据插入条数

数据库表有11个字段,除了id字段以外其余字段都是数据为60位以内的字符串:
测试环境消耗时间字段个数连接池数据插入条数

6.2 Oracle数据插入
针对oracle数据库,下表对比jmeter和datafactory方式的效率差异:
数据库表有2个字段,namestr字段数据为24位的固定字符串:

数据库表有11个字段,namestr字段数据为60位的固定字符串:

附录
一、技术实现:
因mysql网上有相关的教程,这里不做详细介绍。
Oracle部分:
1、
报错:ORA-00911;
解决方案:
2、
报错:ORA-00923;
解决方案:Validation Query:默认是Select 1,如果是Oracle,需改为Select 1
from dual,否则报错 Cannot create PoolableConnectionFactory (ORA-00923: 未找到要求的 FROM 关键字)
jdbc驱动下载链接:
https://dev.mysql.com/downloads/connector/j/
二、展望
1、数据格式需要贴近线上业务,类型包括,图片、音频之类的;
2、需要能够实现指定文件的大小、列数、行数;
网友评论