[笔记] 大家一起来测试,benchmark起来(MySQL下的TPC-C,TPC-H,TPC-W)

时间:2022-11-11 16:49:28

来自:http://www.itpub.net/thread-1330311-1-1.html

前段时间在MySQL下做了些类基准测试,帖出小结。
其中遇到许多小问题,不知道有遗漏步骤没,也还有些问题没解决,希望大家讨论讨论,一起测试起来吧,嘿嘿~


环境:
ubuntu9.10
Server version: 5.1.37-1ubuntu5.4 (Ubuntu)



一、TPC-C(参考:http://samurai-mysql.blogspot.com/2009/03/settingup-dbt-2.html        Settingup DBT-2,需要挂代理,附1)

1)安装MySQL及相关组件
  略

2)下载DBT-2
  http://osdldbt.sourceforge.net/

3)安装所需要的perl包(可参考:http://blog.sina.com.cn/s/blog_48c95a190100h7yq.html)
  shell> sudo cpan Statistics:: Descriptive
  shell> sudo cpan Test::Parser
  shell> sudo cpan Test::Reporter

  (参考资料:http://bbs.chinaunix.net/archiver/?tid-881542.html,
             http://blog.csdn.net/yhb72/archive/2005/11/27/537667.aspx
             http://bbs3.chinaunix.net/thread-1076095-2-1.html)

4)编译DBT-2
  进入相应的DBT-2目录
  cd /home/liova/download/dbt2-0.40/
  执行:
  shell> sudo apt-get install build-essentials
  shell> ./configure --with-mysql=/usr/local/mysql [options] && make
  shell> sudo make install

5)生成所需要的数据库记录
  shell> datagen -w 10 -d /var/tmp/dbt2 --mysql
  -w 指定了数据仓库的个数
  -d 指定了生成的数据所在的目录

7)ubuntu下需要生成一个临时连接,因为mysqld.sock不在tmp目录下(以后每次重启系统都需要先执行这句,如果嫌麻烦,可以修改MySQL的配置文件,把sock文件生成到tmp目录下)
  ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock

6)把生成的记录载入MySQL,在DBT-2目录下执行
  shell> sudo scripts/mysql/build_db.sh -w 3 -d dbt2 -f /var/tmp/dbt2 -s /tmp/mysql.sock -h localhost -u user -p password -e INNODB
  -d 数据库名
  -f 之前生成的数据库记录所在的目录
  -u MySQL的用户名
  -p 相应用户的密码

7)设置环境变量
  shell> export USE_PGPOOL=0
  shell> export LD_LIBRARY_PATH=/usr/local/mysql/lib
  
8)运行DBT-2
  shell> sudo scripts/run_workload.sh -c 16 -d 300 -n -w 10 -s 10 -u user -x password
  -c 并发的线程数
  -d 执行的时间(秒)
  -n 无思考时间,作者说如果想看数据库性能,请不要漏掉这个选项
  -w 数据仓库个数
  -s 每个新线程开始前的延迟时间(微秒)
  -u MySQL用户名
  -x MySQL相应用户的密码
  -l MySQL TCP/IP端口号
  -H MySQL主机名

输出的结果在/home/liova/download/dbt2-0.40/scripts/output/        对应的实验目录下的
如:/home/liova/download/dbt2-0.40/scripts/output/17/driver/results.out


二、TPC-H(参考:http://my2iu.blogspot.com/2009/0 ... eries-on-mysql.html        Running TPC-H Queries on MySQL,需要挂代理,附2;http://www.pilhokim.com/index.php?title=Project/EFIM/TPC-H        Project/EFIM/TPC-H  By Pilho Kim)

1)下载TPC-H的代码,用来生成所需要的数据
  http://www.tpc.org/tpch/spec/tpch_2_8_0.zip 或者
  http://www.tpc.org/tpch/default.asp        右边栏
  两版本略有不同

2)创建MySQL用户、数据库、及授权
  mysql -u root -p
  mysql> CREATE USER 'tpch'@'%' IDENTIFIED BY 'tpch';
  mysql> CREATE DATABASE tpch;
  mysql> GRANT ALL ON tpch.* to 'tpch'@'%';
  mysql> USE tpch;

3)运行tpch目录下的dss.ddl文件,创建tpch数据库中的表
  mysql> \. tpch/gen/dss.ddl

4)然后在tpch文件目录下,把makefile复制并改名成makefile,接着修改makefile文件
  shell> cp makefile.suite makefile
  shell> vim makefile
  makefile中相应项后面填写:
  CC      = gcc  # Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)  #                                  SQLSERVER, SYBASE  # Current values for MACHINE are:  ATT, DOS, HP, IBM, ICL, MVS,   #                                  SGI, SUN, U2200, VMS, LINUX, WIN32   # Current values for WORKLOAD are:  TPCH  DATABASE= SQLSERVER  MACHINE = LINUX  WORKLOAD = TPCH        

5)修改tpch.h文件
  修改其中的SQLSERVER段为:
  #ifdef  SQLSERVER
  #define GEN_QUERY_PLAN        "EXPLAIN;"
  #define START_TRAN                "START TRANSACTION;\n"
  #define END_TRAN                "COMMIT;\n"
  #define SET_OUTPUT                ""
  #define SET_ROWCOUNT                "limit %d;\n"
  #define SET_DBASE                "use %s;\n"
  #endif

6)执行makefile
  shell> make

7)生成需要用的数据
  shell> ./dbgen -s 1
  -s 数据规模因子,1为1G的数据量

8)修改tpch目录下的dss.ri文件
  1.删除 "CONNECT TO TPCD;"
  2.删除所有的 "TPCH."(注意有个点)
  3.删除所有的"COMMIT WORK;"(注意分号也要删除)

9)登录MySQL,并载入之前生成的数据进MySQL
  shell> mysql -u tpch -p
  mysql> use tpch;
  mysql> LOAD DATA LOCAL INFILE 'customer.tbl' INTO TABLE CUSTOMER FIELDS TERMINATED BY '|';
  mysql> LOAD DATA LOCAL INFILE 'orders.tbl' INTO TABLE ORDERS FIELDS TERMINATED BY '|';
  mysql> LOAD DATA LOCAL INFILE 'lineitem.tbl' INTO TABLE LINEITEM FIELDS TERMINATED BY '|';
  mysql> LOAD DATA LOCAL INFILE 'nation.tbl' INTO TABLE NATION FIELDS TERMINATED BY '|';
  mysql> LOAD DATA LOCAL INFILE 'partsupp.tbl' INTO TABLE PARTSUPP FIELDS TERMINATED BY '|';
  mysql> LOAD DATA LOCAL INFILE 'part.tbl' INTO TABLE PART FIELDS TERMINATED BY '|';
  mysql> LOAD DATA LOCAL INFILE 'region.tbl' INTO TABLE REGION FIELDS TERMINATED BY '|';
  mysql> LOAD DATA LOCAL INFILE 'supplier.tbl' INTO TABLE SUPPLIER FIELDS TERMINATED BY '|';

10)执行tpch目录下的dss.ri
  mysql> \. dss.ri

11)由于查询中使用的是小写表名,而使用dss.ddl生成的表名是大写的,所以转换表名成小写
  mysql> alter table NATION rename nation;
  mysql> alter table SUPPLIER rename supplier;
  mysql> alter table REGION rename region;
  mysql> alter table PARTSUPP rename partsupp;
  mysql> alter table PART rename part;
  mysql> alter table ORDERS rename orders;
  mysql> alter table LINEITEM rename lineitem;
  mysql> alter table CUSTOMER rename customer;

12)执行(最后这步有点错误,暂时没找到解决的办法,哪位老大解决了教我呀呀呀,thx~~)
  cp dists.dss queries
  cd queries
  ../qgen -c tpch -s 1 1 

12)我所用的替代方法
  在tpch目录的queries子目录下,新建文件:Q1.sql,Q2.sql,…,Q21,sql,Q22.sql
  在每个文件中添加相应的查询(http://www.pilhokim.com/index.ph ... C-H_default_queries,TPC-H的默认查询,经过MySQL 5.1.23测试通过,附3)

13)登录MySQL,手动执行TPC-H的默认查询
  shell> mysql -u tpch -p
  mysql> use tpch;
  mysql> source /home/liova/download/tpch/queries/Q1.sql;
  mysql> source /home/liova/download/tpch/queries/Q2.sql;
  …
  …
  mysql> source /home/liova/download/tpch/queries/Q22.sql;


三、TPC-W (相关文档:Installing and Getting TPC-W to run on Virtuoso-12.pdf         By Ashish Gupta以及网站http://mitglied.multimania.de/jankiefer/tpcw/index.html, TPC-W Java Implementation)

1)下载 TPC-W Java版 http://mitglied.multimania.de/jankiefer/tpcw/index.html
  比较难下载,很经常下一半丢失连接,多试几次,下完全的文件tpcw-java-dist-1.0.zip大小为1.13M。

2)下载并安装Tomcat(可参考http://deepfuture.广告.com/blog/591885)
  1.安装jdk6
    shell>sudo apt-get install sun-java6-jdk(用新得立软件包安装)
  2.下载tomcat6
    下载地址是:http://tomcat.apache.org/
    本次安装的是:apache-tomcat-6.0.18.tar.gz
  3.安装
    将压缩包拷贝到你自己想放的目录下,这里是/home/liova/download/tpcw/
    shell>sudo cp apache-tomcat-6.0.18.tar.gz /home/liova/download/tpcw/
    解压文件
    shell>cd /home/liova/download/tpcw/
    shell>sudo tar zxvf apache-tomcat-6.0.18.tar.gz


    解压完成后,会在 /home/liova/download/tpcw/ 下生成文件夹 apache-tomcat-6.0.18

    在/usr/local 下建立软链接,名字是tomcat6
    shell>cd /usr/local
    shell>sudo ln -s /home/liova/download/tpcw/apache-tomcat-6.0.18 tomcat6

    测试tomcat是否能够正常启动
    shell>sudo /usr/local/tomcat6/bin/startup.sh        (这里图简单没有配置tomcat开机启动,所以以后每次重启都要先执行这条命令开启tomcat)
    打开firefox,输入http://localhost:8080/,如果正常访问,则表示成功。

3)下载并安装Apache Ant来编译Java代码(可参考http://wangxc.广告.com/blog/665521)
  1.下载地址 Ant: 
    地址:http://ant.apache.org/ 
  2.解压ANT包
    tar zxvf apache-ant-1.8.1-bin.tar.gz 
  3.将解压的Ant文件移动到/opt/ant目录下
    mv apache-ant-1.8.1 /opt/ant
  4.修改配置文件中的环境ANT_HOME 
    sudo vim /etc/profile
    在文件末尾添加如下,在umask前加上#
    
    #umask 022    
    export JAVA_HOME=/usr/lib/jvm/java-6-sun    
    export MVN_HOME=/opt/maven    
    export ANT_HOME=/opt/ant    
    export PATH=$ANT_HOME/bin:$MVN_HOME/bin:$PATH:

4)安装MySQL
  略.

5)下载JDBC MySQL驱动
  http://dev.mysql.com/downloads/connector/j/3.0.html
  解压后复制mysql-connector-java-3.0.15-ga-bin.jar到此路径下(不存在则自己创建):/usr/local/tomcat/webapps/tpcw/WEB-INF/lib

6)下载servlet.jar
  下完复制到此路径下(不存在则自己创建):/usr/local/jakarta-tomcat-6/server/lib/servlet.jar

7)设置参数
  1.根据自己的路径在/etc/profile末尾添加:    
   export CLASSPATH=/usr/local/jakarta-tomcat-6/server/lib/servlet.jar:/usr/lib/jvm/:/home/liova/download/tpcw/tpc-w/:/usr/lib/jvm/java-6-sun-1.6.0.20/lib/dt.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/lib/tools.jar:$CLASSPATH
  2.解压刚开始下载的tpcw-java-dist-1.0.zip文件,我这里解压到路径/home/liova/download/tpcw/tpc-w/下,修改其中的main.properties和tpcw.properties
    
    下面是我的main.properties(最后的dbName确实要用std,但之后我们在数据库里建的数据库名是用tpcw):

##############################################################################
# main.properties for build.xml.
# Copyright 2003 by Jan Kiefer.
#
# This file is distributed "as is". It comes with no warranty and the 
# author takes no responsibility for the consequences of its use.
#
# Usage, distribution and modification is allowed to everyone, as long 
# as reference to the author(s) is given and this license note is included.
###############################################################################
<!-- Path to servlet.jar, change this ... -->
cpServ=/usr/local/jakarta-tomcat-6/server/lib/servlet.jar

#<!-- Path to the JDBC driver for your DBMS, change this ... -->
cpJDBC=/usr/local/tomcat6/webapps/tpcw/WEB-INF/lib/mysql-connector-java-3.0.17-ga-bin.jar

#<!-- Directory where tpcw.war will be put with task 'inst' -->
webappDir=/usr/local/tomcat6/webapps/tpcw

#<!-- Path to the Perl interpreter. -->
perlPath=/usr/bin/perl

#<!-- Directory where the Images will be put with task genimg. -->
imagesDir=${webappDir}/Images

#<!-- Filter file for SQL queries, change this if needed -->
sqlFilter=sql-mysql.properties

dbName=std
#dbName=tpcw


    以及我的tpcw.properties:

##############################################################################
# tpcw.properties for build.xml.
# Copyright 2003 by Jan Kiefer.
#
# This file is distributed "as is". It comes with no warranty and the 
# author takes no responsibility for the consequences of its use.
#
# Usage, distribution and modification is allowed to everyone, as long 
# as reference to the author(s) is given and this license note is included.
##############################################################################
# set the JDBC parameters
jdbc.driver=com.mysql.jdbc.Driver
#jdbc.driver=com.mckoi.JDBCDriver
jdbc.path=jdbc:mysql://localhost:8080/tpcw?user=tpcw&password=tpcw
jdbc.connPoolMax=100

#sql.bigCharType=varchar(500)
sql.bigCharType=tinyblob

# set the values you want for tpcw
num.item=1000
num.eb=10

# use the right session string for your servlet container
#sessionIdString=$sessionid$
sessionIdString=jsessionid=

standardUrl=http://localhost:8080
#servletUrlPath=/servlet
servletUrlPath=/
tpcwUrlPath=/tpcw
    

8)在MySQL中传见数据库tpcw,并给数据库tpcw的权限给用户tpcw
  create database tpcw;
  GRANT ALL PRIVILEGES ON tpcw.* TO tpcw@'%' IDENTIFIED BY "tpcw" WITH GRANT OPTION;

9)修改函数名。
  /home/liova/download/tpcw/tpc-w/src/rbe/util/Debug.java中
  public class Debug {  public static void assert(boolean assertCond, String message)

  把assert改成你自己想要的名字,我是改成assert1。
  接着以下三个文件中所有出现的Debug.assert中的assert都改成你自己修改函数名,我这里改完是Debug.assert1
  /home/liova/download/tpcw/tpc-w/src/rbe/EB.java
  /home/liova/download/tpcw/tpc-w/src/rbe/util/CharSetStrPattern.java
  /home/liova/download/tpcw/tpc-w/src/rbe/util/Histogram.java

10)cd /home/liova/download/tpcw/tpc-w/
  1.执行命令
    ant dist        (这条命令用来编译servlets以及rbe java文件)
    ant inst        (这命令执行后,将把tpcw.war包移动到tomcat的tpcw目录下)  
  2.创建数据库中的表及记录,执行
    ant gendb        (这命令将调用TPCW_populate.class)
  3.创建图像
    ant genimg        (这命令将用make编译图像生成工具,用perl去运行图像生成脚本,复制静态图像到tomcat主目录)

11)修改/usr/local/tomcat6/conf/下的server.xml,在<host></host>标签中间添加如下代码:
   <Context path="/tpcw" docBase="/tpcw/tpcw.war" debug="0" reloadable="false" crossContext="true" privileged="false">
   <Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_tpcw_log." suffix=".txt" verbosity="0" timestamp="true"/>
   </Context> 



做到这里就安装好了,可以运行了。
可以访问http://localhost:8080/tpcw/TPCW_home_interaction页面测试是否安装成功。



12)运行TPC-W
   1.cd /home/liova/download/tpcw/tpc-w/dist/
   2.sudo java rbe.RBE -EB rbe.EBTPCW1Factory 30 -OUT run1.m -RU 100 -MI 1000 -RD 100 -WWW http://localhost:8080/tpcw/ -CUST 10000 -ITEM 10000

   命令的解释可参考/home/liova/download/tpcw/tpc-w/docs/use.html以及/home/liova/download/tpcw/tpc-w/dist/doc/readme-rbe.txt

   输出的结果在/home/liova/download/tpcw/tpc-w/dist/下的run1.m文件中(名字自己在参数的指定)




ps:
如果运行中出现EB error, unable to open url……, 可以看见url中有UNAME和PASSWD字段,这代表用户名和密码。一般出错的原因是数据库tpcw中的customer表中没有相对应用户的记录(所有用户信息都在customer表中),可能是由于创建数据库记录过程中一些记录的用户名和密码被截断了,我因为图简单没去找代码中哪出错(哪为老大要是解决了希望能分享啊分享啊啊啊,thx~~),我直接修改了数据库中的相应记录。比如:
tpcw中customer表中,我把某条记录修改为:
c_uname                c_passwdOGALININRE        ogalininre        ->        OGALINININRE        ogalinininre