Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108558
  • 博文数量: 13
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 13:16
个人简介

数据库领域专心吃草

文章分类

全部博文(13)

文章存档

2015年(1)

2014年(4)

2013年(8)

我的朋友

分类: Mysql/postgreSQL

2013-12-25 10:42:25

安装TPCC工具

    tpcc是percona公司提供的开源基准测试工具,目前项目放在bazaar上,需要从bazaar上下载源代码然后进行编译。下载完源码包进入src目录,然后make即可。这时候会在上级目录生成两个工具:tpcc_load,tpcc_start,如下图:
    
    tpcc_load是用来模拟数据的,用法:./tpcc_load  hostname:port  dbname  user  password  WAREHOUSES。
    hostname:port是数据库的IP和端口,
    dbname是测试用的数据库,
    user是连接数据库的账户,
    password是连接数据库的密码,
    warehouses是衡量数据量的一个正整数。
    如:./tpcc_load 127.0.0.1:3306 tpcc1000 root pwd 100

    tpcc_start是用来测试tpmC的工具,tpmC是衡量OLTP能力的一种标准,想深入了解的可以百度百科。用法:
./tpcc_start  hostname   port   dbname  user  WAREHOUSES  CONNECTIONS  WARMUPTIME  BENCHMARKTIME。
    hostname(-h)是数据库的IP;
    port(-P)是数据库的监听端口;
    dbname(-d)测试的数据库;
    user(-u)连接数据库的账户;
    password(-p)连接数据库的密码;
    warehouses(-w)衡量数据量的一个正整数;
    connections(-c)测试并发连接数;
    warmuptime(-r)预热时间,单位为秒;
    Benchmarktime(-l)指测试的时长。
    如:./tpcc_start -h127.0.0.1 -P3306 -dtpcc1000 -uroot -ppwd -w100 -c12 -r120 -l600
    
     以上用法可以在源代码的根目录README文件中找到。

基准测试步骤

    1、创建数据库
    mysql -uroot -ppwd -e "create database tpcc1000"

    2、进入tpcc_load、tpcc_start所在文件目录,然后创建表
    mysql -uroot -ppwd --database="tpcc1000" < ./create_table.sql
    
    3、创建外键、索引等约束,如果不希望把外键约束加入基准测试中,那么可以修改该文件只选择添加索引的语句来执行。
    mysql -uroot -ppwd --database="tpcc1000" < ./add_fkey_idx.sql 

    4、模拟数据,数据量根据需要自己选择
    ./tpcc_load 127.0.0.1:3306 tpcc1000 root pwd 100

    5、开始基准测试
    ./tpcc_start -h127.0.0.1 -P3306 -dtpcc1000 -uroot -ppwd -w100 -c12 -r120 -i600

测试innodb_flush_log_at_trx_commit的不同值对mysql的性能影响

    测试环境:
    rhel5.4 32位 1CPU(6 core),因为博主的硬盘就2个,做了raid1,所以性能瓶颈在IO上。
    mysql5.5.34-log
    tpcc配置:100warehouses;预热时间120秒;测试时间10分钟
    my.cnf配置:

点击(此处)折叠或打开

  1. [mysqld]
  2. port = 3306
  3. socket = /tmp/mysql.sock
  4. skip-external-locking
  5. key_buffer_size = 16M
  6. max_allowed_packet = 1M
  7. table_open_cache = 4
  8. sort_buffer_size = 64K
  9. read_buffer_size = 256K
  10. read_rnd_buffer_size = 256K
  11. net_buffer_length = 2K
  12. innodb_file_per_table=1
  13. thread_stack=1024000
  14. innodb_buffer_pool_size=1610612736
  15. datadir=/data
  16. basedir=/usr/local/mysql
  17. slow_query_log=ON
  18. slow_launch_time=1
  19. innodb_flush_log_at_trx_commit=1

测试结果:

connections\tpmC 1 0 2
1 284.6tpmC 611.6tpmC 616.7tpmC
8 669.5tpmC 927.2tpmC 906.8tpmC
16 841.7tpmC 915.2tpmC 902.3tpmC
32 906tpmC 960.2tpmC 945.3tmpC
64 906.8tpmC 930.4tpmC 932.1tpmC
128 914.2tpmC 927.6tpmC 902tpmC
256 921.5tpmC 933.9tpmC 922tpmC


     总结:
     在IO密集的环境下,设置innodb_flush_log_at_trx_commit为0或者2能够有效的提升数据库的性能,但是性能的提升是建立在牺牲数据安全的基础上,因为0或者2的参数不能保证数据是实时的持久化到磁盘上的,并且性能的提升在并发性比较高的情况下越来越不明显。所以在IO密集环境下,如果并发比较高,即使业务容许丢失几秒钟的数据,但为了那么一点点的性能提升而降低了数据安全性可能并不是我们的好选择。

      疑问:    
      1、由图表中可以看到当Innodb_flush_log_at_trx_commit值为0或者2的时候,随着并发提升tpmC值并不是一直增加的,而是很快就会开始下降。我们知道现在的操作系统调度的基本单位是线程,在mysql中一个连接就是一个线程,当操作系统处理比较多的连接的时候,需要频繁的切换线程,这会造成CPU的缓存MISS的几率升高,进而降低系统的性能(mysql企业版提供了线程池解决了线程过多性能降低的问题,但是社区版好像没有提供这种功能,mariadb、percona-server也提供了线程池的功能)。所以mysql的tpmC值并不是随着并发的增加而增加,而是呈现一个波谷->波峰->波谷的线性变化规律。然而根据图表中的数据推测:innodb_flush_log_at_trx_commit设置为0和2可能把tpmC值的波峰提前了,为了验证这个猜测还需要更多的测试。
       2、在CPU密集的环境下改变inndodb_flush_log_at_trx_commit对mysql的性能有什么影响?
       3、改变innodb_io_capacity的值在IO密集环境下对性能会有什么影响?

       后续测试:上图的表格中最后面橙色部分是后续测试的结果,为了验证疑问1,增大了并发连接数进行基准测试。可以看到线程数从32增加到256的时候,innodb_flush_log_at_trx_commit为1的mysql性能表现为不断上涨趋势,而为0或者2的mysql的性能表现平稳,所以疑问1的猜测应该不成立。
       附统计图:

                



阅读(4511) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~