BenchmarkSQL数据库基准测试工具
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BenchmarkSQL数据库基准测试⼯具
之前有介绍过sysbench基准测试⼯具,类似的开源测试⼯具还有BenchmarkSQL,⼀个JDBC基准测试⼯具,内嵌了TPC-C测试脚本,也⽀持很多数据库,如PostgreSQL、Oracle和Mysql等。
1、软件环境
系统⽤CentOS7
Java,因为BenchmarkSQL本⾝是使⽤Java语⾔编写的,所以如果在Linux系统下还没有安装JDK的话,我们⾸先需要对其进⾏安装数据库,本例先介绍PostgreSQL和Mysql
Ant,⽤来对BenchmarkSQL进⾏编译
EPEL仓库
R语⾔,⽤来⽣成图形报告
以及上述软件的依赖。
2、安装过程
2.1、安装ant
yum -y install ant
2.2、安装EPEL仓库
安装su -c 'rpm -Uvh https:///pub/epel/epel-release-latest-7.noarch.rpm'
更新yum -y update
2.3、安装R语⾔
yum -y install R
2.4、安装BenchmarkSQL
在中下载所需的包,上传⾄服务器后完成解压:unzip ./benchmarksql-5.0.zip
进⼊解压后的⽬录⽤ant编译
cd benchmarksql
ant
此时会编译出⼀个版本 benchmarksql-5.0/dist/BenchmarkSQL-5.0.jar,但是该版本并不⽀持MySQL的TPC-C测试,需要做如下的修改。
修改benchmarksql源码
(1)修改benchmarksql-5.0/src/client/jTPCC.java,增加mysql相关部分,如下所⽰:
if (iDB.equals("firebird"))
dbType = DB_FIREBIRD;
else if (iDB.equals("oracle"))
dbType = DB_ORACLE;
else if (iDB.equals("postgres"))
dbType = DB_POSTGRES;
else if (iDB.equals("mysql"))
dbType = DB_UNKNOWN;
else
{
log.error("unknown database type '" + iDB + "'");
return;
}
(2)修改benchmarksql-5.0/src/client/jTPCCConnection.java, SQL⼦查询增加"AS L"别名,如下所⽰:
default:
stmtStockLevelSelectLow = dbConn.prepareStatement(
"SELECT count(*) AS low_stock FROM (" +
" SELECT s_w_id, s_i_id, s_quantity " +
" FROM bmsql_stock " +
" WHERE s_w_id = ? AND s_quantity < ? AND s_i_id IN (" +
" SELECT ol_i_id " +
" FROM bmsql_district " +
" JOIN bmsql_order_line ON ol_w_id = d_w_id " +
" AND ol_d_id = d_id " +
" AND ol_o_id >= d_next_o_id - 20 " +
" AND ol_o_id < d_next_o_id " +
" WHERE d_w_id = ? AND d_id = ? " +
" ) " +
" )AS L");
break;
重新编译修改后的源码,此时得到的benchmarksql版本 benchmarksql-5.0/dist/BenchmarkSQL-5.0.jar 已经⽀持MySQL的TPC-C测试。
cd benchmarksql-5.0
ant
修改相关脚本,⽀持Mysql
(1)修改⽂件:benchmarksql-5.0/run/funcs.sh,添加mysql 数据库类型。
function setCP()
{
case "$(getProp db)" in
firebird)
cp="../lib/firebird/*:../lib/*"
;;
oracle)
cp="../lib/oracle/*"
if [ ! -z "${ORACLE_HOME}" -a -d ${ORACLE_HOME}/lib ] ; then
cp="${cp}:${ORACLE_HOME}/lib/*"
fi
cp="${cp}:../lib/*"
;;
postgres)
cp="../lib/postgres/*:../lib/*"
;;
mysql)
cp="../lib/mysql/*:../lib/*"
;;
esac
myCP=".:${cp}:../dist/*"
export myCP
}
...省略
case "$(getProp db)" in
firebird|oracle|postgres|mysql)
;;
"") echo "ERROR: missing db= config option in ${PROPS}" >&2
exit 1
;;
*) echo "ERROR: unsupported database type 'db=$(getProp db)' in ${PROPS}" >&2
exit 1
;;
esac
(2)添加mysql java connector驱动,下载对应版本的驱动,,如8.0以上版本下载对应的驱动mysql-connector-java-8.0.18.jar 需⾃⾏下载。
mkdir -p benchmarksql-5.0/lib/mysql
cp mysql-connector-java-8.0.18.jar benchmarksql-5.0/lib/mysql/
(3)修改benchmarksql-5.0/run/runDatabaseBuild.sh,去掉extraHistID
AFTER_LOAD="indexCreates foreignKeys extraHistID buildFinish"
修改为:
AFTER_LOAD="indexCreates foreignKeys buildFinish"
2.5、配置测试参数⽂件
配置
cd run
cp props.pg postgres.properties
cp props.pg mysql.properties
vim postgres.properties
vim mysql.properties
配置⽂件详解:
db=postgres //数据库类型,postgres,mysql
driver=org.postgresql.Driver //驱动,mysql8.0以上为com.mysql.cj.jdbc.Driver
conn=jdbc:postgresql://localhost:5432/postgres //PG数据库连接字符串,正常情况下,需要更改localhost为对应PG服务IP、
5432位对应PG服务端⼝、postgres为对应测试数据库名
user=benchmarksql //数据库⽤户名,通常建议⽤默认,这就需要我们提前在数据库中建⽴benchmarksql⽤户
password=PWbmsql //如上⽤户密码
warehouses=1 //仓库数量,数量根据实际服务器内存配置,配置⽅法见第3步
loadWorkers=4 //⽤于在数据库中初始化数据的加载进程数量,默认为4,实际使⽤过程中可以根据实际情况调整,加载速度会随worker数量的增加⽽有所提升
terminals=1 //终端数,即并发客户端数量,通常设置为CPU线程总数的2~6倍
runTxnsPerTerminal=10 //每个终端(terminal)运⾏的固定事务数量,例如:如果该值设置为10,意味着每个terminal运⾏10个事务,如果有32个终端,那整体运⾏320个事务后,测试结束。
该参数配置为⾮0值时,下⾯的runMins参数必须设置为0
runMins=0 //要测试的整体时间,单位为分钟,如果runMins设置为60,那么测试持续1⼩时候结束。
该值设置为⾮0值
时,runTxnsPerTerminal参数必须设置为0。
这两个参数不能同时设置为正整数,如果设置其中⼀个,另⼀个必须为0,主要区别是runMins定义时间长度来控制测试时间;runTxnsPerTerminal定义事务总数来控制时间。
limitTxnsPerMin=300 //每分钟事务总数限制,该参数主要控制每分钟处理的事务数,事务数受terminals参数的影响,如果
terminals数量⼤于limitTxnsPerMin值,意味着并发数⼤于每分钟事务总数,该参数会失效,想想也是如此,如果有1000个并发同时发起,那每分钟事务数设置为300就没意义了,上来就是1000个并发,所以要让该参数有效,可以设置数量⼤于并发数,或者让其失效,测试过程中⽬前采⽤的是默认300。
terminalWarehouseFixed=true //终端和仓库的绑定模式,设置为true时可以运⾏4.x兼容模式,意思为每个终端都有⼀个固定的仓库。
设置为false时可以均匀的使⽤数据库整体配置。
TPCC规定每个终端都必须有⼀个绑定的仓库,所以⼀般使⽤默认值true。
//下⾯五个值的总和必须等于100,默认值为:45, 43, 4, 4 & 4 ,与TPC-C测试定义的⽐例⼀致,实际操作过程中,可以调整⽐重来适应各种场景。
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS //测试数据⽣成⽬录,默认⽆需修改,默认⽣成在run⽬录下⾯,名字形如my_result_xxxx的⽂件夹。
osCollectorScript=./misc/os_collector_linux.py //操作系统性能收集脚本,默认⽆需修改,需要操作系统具备有python环境
osCollectorInterval=1 //操作系统收集操作间隔,默认为1秒
//osCollectorSSHAddr=user@dbhost //操作系统收集所对应的主机,如果对本机数据库进⾏测试,该参数保持注销即可,如果要对远程服务器进⾏测试,请填写⽤户名和主机名。
osCollectorDevices=net_eth0 blk_sda //操作系统中被收集服务器的⽹卡名称和磁盘名称,例如:使⽤ifconfig查看操作系统⽹卡名称,找到测试所⾛的⽹卡,名称为enp1s0f0,那么下⾯⽹卡名设置为net_enp1s0f0(net_前缀固定);使⽤df -h查看数据库数据⽬录,名称为(/dev/sdb 33T 18T 16T 54% /hgdata),那么下⾯磁盘名设置为blk_sdb(blk_前缀固定)
2.6、进⾏测试
执⾏当前路径下的shell脚本:
./runDatabaseBuild.sh my_postgres.properties
./runBenchmark.sh my_postgres.properties
[NOTE]
测试之前要在数据库中创建相应的database和user,还要注意权限的问题。
2.7、结果处理
测试结束后,run⽬录下会⽣成⼀个新⽬录,它的命名格式为 my_result_%tY-%tm-%td_%tH%tM%tS。
使⽤ generateReport.sh my_result_* 脚本创建具有图形的 HTML ⽂件:
例如:
./generateReport.sh my_result_2018-09-30_133047。