> CentOS > CentOS教程 >

Centos6.4下对mysql进行压力测试

单机运行环境搭建之 --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%';



(责任编辑:IT)