zoukankan      html  css  js  c++  java
  • 15、单机运行环境搭建之 --Centos6.4下对mysql进行压力测试

     ===================================================================================================

    方案一:Mysql自带了压力测试工具mysqlslap,所以我们可以不用自己编写程序来测试Mysql读取的压力。压力测试shell脚本如下:

     创建表的脚本:

    CREATE TABLE `test` (
      `c1` int(11) DEFAULT NULL,
      `c2` int(11) DEFAULT NULL,
      `c3` int(11) DEFAULT NULL,
      `c4` varchar(256) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

     vi /usr/local/test_insert.sh

    #!/bin/sh  
    
    while true  
    do  
        mysqlslap --concurrency=100 --iterations=10 --create-schema='test' --query="insert into test(c1,c2,c3,c4) values(1,1,1,'a')" --number-of-queries=200 --debug-info -uroot -pdsideal
        usleep 100  
    done  

    运行:

    chmod +x /usr/local/test_insert.sh 
    
    /usr/local/test_insert.sh 

     上面脚本的意思是每隔100ms循环做这样的事:模拟100个mysql客户端,对数据库test的表test执行200次插入(number-of-queries = concurrency * 每个mysql客户端的查询次数,所以这里的每个mysql客户端的查询次数是2次),迭代10次。--debug-info是打印内存和CPU的相关信息。

    接着我们可以编写shell脚本来输出指定时间间隔(比如1秒)内的mysql操作次数,shell脚本如下:

    vi /usr/local/view_test.sh

    #!/bin/sh  
      
    lastTimes="0"  
      
    while true  
    do  
        currentTimes=$(mysql -uroot -p'dsideal' -e "show global status like 'Com_insert'" | sed '1d' | awk '{print $2}')  
        times=$(expr ${currentTimes} - ${lastTimes})  
        lastTimes="${currentTimes}"  
        echo "${times}"  
        sleep 1  
    done  

    运行:

    chmod +x /usr/local/view_test.sh

    /usr/local/view_test.sh

    查看mysql各种操作的次数,可以通过查看global status里的'Com_'开头的变量,它们就是mysql的操作命令,比如Com_insert就是插入命令、Com_update就是更新命令,等等,具体可以查看文档说明。将相邻两次的次数相减,就得到这个时间间隔内执行的次数。

    PS:除了iostat等命令外,也可以通过top命令来查看io的负载(看wait的百分比,如果大于等于 1 / cpu核数,则说明硬盘IO有问题)。请参考:Understanding Disk I/O - when should you be worried?

    #########################################################################################################

    方案二:使用sysbench

    sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。关于这个项目的详细介绍请看:http://sysbench.sourceforge.net。

    它主要包括以下几种方式的测试:

    1、cpu性能
    2、磁盘io性能
    3、调度程序性能
    4、内存分配及传输速度
    5、POSIX线程性能
    6、数据库性能(OLTP基准测试)
    目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。

    一、安装

    首先,在 http://sourceforge.net/projects/sysbench 下载源码包。接下来,按照以下步骤安装:

    yum -y install libtool

    cd /usr/local

    wget http://downloads.sourceforge.net/project/sysbench/sysbench/0.4.12/sysbench-0.4.12.tar.gz

    tar zxf sysbench-0.4.12.tar.gz
    cd sysbench-0.4.12
    ./configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib

    cp /usr/bin/libtool libtool

    make

    make install

     二、开始测试

    编译成功之后,就要开始测试各种性能了,测试的方法官网网站上也提到一些,但涉及到 OLTP 测试的部分却不够准确。在这里我大致提一下:
    1、cpu性能测试

    export LD_LIBRARY_PATH=/usr/local/mysql/lib
    
    sysbench --test=cpu --cpu-max-prime=20000 run

    cpu测试主要是进行素数的加法运算,在上面的例子中,指定了最大的素数为 20000,自己可以根据机器cpu的性能来适当调整数值。

    2、线程测试

    sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run

    3、磁盘IO性能测试

    sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare
    sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw run
    sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup

    上述参数指定了最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。

    4、内存测试

    sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run

    上述参数指定了本次测试整个过程是在内存中传输 4G 的数据量,每个 block 大小为 8K。

    5、OLTP测试

    sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 \
    --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-host=10.10.3.154 \
    --mysql-password=dsideal --mysql-db=test prepare 

    sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 \
    --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-host=10.10.3.154 \
    --mysql-password=dsideal --mysql-db=test run 

    sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000000 --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-host=10.10.3.154 --mysql-password=dsideal --mysql-db=test cleanup

    上述参数指定了本次测试的表存储引擎类型为 myisam,这里需要注意的是,官方网站上的参数有一处有误,即 --mysql-table-engine,官方网站上写的是 --mysql-table-type,这个应该是没有及时更新导致的。另外,指定了表最大记录数为 1000000,其他参数就很好理解了,主要是指定登录方式。测试 OLTP 时,可以自己先创建数据库 sbtest,或者自己用参数 --mysql-db 来指定其他数据库。--mysql-table-engine 还可以指定为 innodb 等 MySQL 支持的表存储引擎类型。

    好了,主要的就是这些了,想要了解更多信息就访问 sysbench 项目的主页吧。

    sync_binlog=1


    sync_binlog:这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。对于“sync_binlog”参数的各种设置的说明如下:
    sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。
    sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
    在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。从以往经验和相关测试来看,对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。

    transaction-isolation=READ-COMMITTED innodb_buffer_pool_size = 2500M

    innodb_buffer_pool_size 定义了 InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小。和 MyISAM 存储引擎不同, MyISAM 的 key_buffer_size 只能缓存索引键,而 innodb_buffer_pool_size 却可以缓存数据块和索引键。适当的增加这个参数的大小,可以有效的减少 InnoDB 类型的表的磁盘 I/O 。在一个以 InnoDB 为主的专用数据库服务器上,可以考虑把该参数设置为物理内存大小的 60%-80% 。
    innodb_thread_concurrency
    = 9 innodb_flush_log_at_trx_commit = 1 innodb_io_capacity = 400

     

    假如你有一台服务器,专用于典型的Web项目,需要存放海量的数据,并使用MySQL InnoDB引擎
    内存:16G
    问题来了:你会怎样配置这个服务器?
    
    以下的InnoDB 性能优化概要普遍的适用于大多数的项目
    
    硬件
    内存  对于使用InnoDB引擎存储海量数据,内存是最重要的。16G-32G 是目前较为低成本高效率的。
    CPU 在CPU方面2个双核的CPU也可以胜任,但如果有4核的CPU当然可以担任更大的工作量
    IO系统  带有后备电池的RAID是一个很好的选择
    硬盘    6到8个硬盘会比较符合标准要求,而2.5英寸 SAS硬盘,速度会更快。RAID10 对于数据存储和大多数为读操作的应用的支持很好,如果你喜欢冗余磁盘阵列RAID5,要当心它的随机写
    操作系统
    使用64位的操作系统。在数据库备份方面,在大多数情况下,EXT3文件系统会比LVM更高效。
    
    MySQL InnoDB 设置
    innodb_buffer_pool_size 内存的70-80% 是一个安全的选择. 如果有16G内存,可以设置为12G
    innodb_log_file_size 取决于你的还原速度需要,而对于合理的还原时间和高效的性能,可以设置为256M
    innodb_log_buffer_size=4M 对于大多数情况,4M比较合理,除非你传送一些很大的二进制数据块到InnoDB,可以稍微调大点
    innodb_flush_log_at_trx_commit=2  如果不太在意ACID属性和容许丢失最后时刻的少量事务
    innodb_thread_concurrency=8  这个数字要根据实际的情况来设定,但对于大多数的情况,是一个比较合适的设置
    innodb_flush_method=O_DIRECT  避免重复缓冲和减少linux交换分区的压力,在大多数情况下这个设置可以改善性能,但如果你没有后备电源备份RAID缓存,某些缓存会被洗掉
    innodb_file_per_table – 如果你没有大量的表,可以使用这个选项,但使用了这个选项后,你将不能控制innodb的主表空间,自MySQL 4.1以后加入并可以稳定使用
    
    如果项目可以运行 READ-COMMITED 唯一性模式,可以设置 transaction-isolation=READ-COMMITTED,在MySQL 5.0 这个选项有利于行级锁的性能提高,5.1以后,也有利于行级复制
    
    使用InnoDB的应用程序调优
    对于习惯使用MyISAM的开发人员,在InnoDB需要了解部分改变。
    当你进行update操作的时候,要确保使用事务, 既为一致起见,也为获得更好的性能
    假如你的项目有任何的写操作,就要准备好可能发生的死锁。
    检查表结构并且思考如何利用InnoDB的特性,例如主键集群,在索引里面包含主键(但要保证主键的长度),通过主键快速查找,打包大的索引。

    修改最大连接数

      vi /etc/my.cnf

    max_connections=1000

     mysql -uroot -p

     show variables like '%connection%';

  • 相关阅读:
    set RowCount 与 top n
    Ubuntu 12.04 64bit 安装编译GCC 4.1.2 绝对原创
    C语言第11课
    Cocos2d-x之MenuItem
    wamp 已安装cakephp Fatal error: You must enable the intl extension to use CakePHP. in XXX
    jQuery性能优化38建议---最引人注目的用户体验!
    在面对变化,撇开NO
    批学习
    JAVA修饰符类型(public,protected,private,friendly)
    【Espruino】NO.15 nRF24L01+无线收发器
  • 原文地址:https://www.cnblogs.com/littlehb/p/3016647.html
Copyright © 2011-2022 走看看