Centos6.4下对mysql进行压力测试
时间:2015-01-07 23:41 来源:linux.it.net.cn 作者:IT
单机运行环境搭建之 --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)
单机运行环境搭建之 --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性能 一、安装首先,在 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 测试的部分却不够准确。在这里我大致提一下: 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) |