原文:http://blog.itpub.net/29734436/viewspace-2140565/
还有一篇值得关注的,先等我缓缓,然后在总结出一份自己的来。其地址为:https://www.jianshu.com/p/f15d2a35dfd7
类别 | 名称 |
---|---|
OS | 虚拟机 CentOS release 6.5 (Final) |
DISK | 765GB |
MySQL | v5.6.27 |
Sysbench | v0.5 |
利用现在生产MySQL备库搭建压力测试环境,在测试时,停掉备库的slave复制:
说明:本次测试,只测试在不同情况下的select查询,用来测试的sql如下:
SELECT pad FROM test.sbtest1 where k = ‘xxxxxx;
执行下面的命令准备测试数据:
sysbench --test=/usr/local/src/sysbench-0.5/sysbench/tests/db/oltp.lua \
--mysql-host=localhost \
--mysql-user=root \
--mysql-password=xxxxx \
--mysql-db=test \
--oltp-tables-count=1 \
--oltp-table-size=1000000 \
--num-threads=50 \
--max-requests=1000000 \
--report-interval=1 \
prepare
上述命令会在MySQL的test数据库里面创建sbtest1表,数据量为100w行。
参数说明:
--mysql-host=locahost #数据库host
--mysql-port=3306 #数据库端口
--mysql-user=your_username #数据库用户名
--mysql-password=your_password #数据库密码
--mysql-db=your_db_for_test #数据库名
--oltp-tables-count=1 #模拟的表的个数,规格越高该值越大
--oltp-table-size=1000000 #模拟的每张表的行数,规格越高该值越大
--num-threads=50 #模拟的并发数量,规格越高该值越大
--max-requests=100000000 #最大请求次数
--report-interval=1 #每1秒打印一次当前的QPS等值
--test=/usr/local/src/sysbench-0.5/sysbench/tests/db/oltp.lua#选用的测试脚本(lua),此脚本可以从sysbench-0.5源代码文件目录下找 [prepare | run | cleanup] #prepare准备数据,run执行测试,cleanup清理数据
sysbench --test=/usr/local/src/sysbench-0.5/sysbench/tests/db/select.lua \
--mysql-host=localhost \
--mysql-user=root \
--mysql-password=xxxx \
--mysql-db=test \
--oltp-tables-count=1 \
--oltp-table-size=1000000 \
--num-threads=16 \
--max-requests=1000000 \
--report-interval=1 \
--max-time=60 \
run
说明:
--num-threads=16 #模拟数据库线程并发数量,规格越高该值越大
--max-time=60#最大测试时间(与--max-requests只要有一个超过,则退出)。
利用sysbench测试了并发线程个数不同的情况下,分别执行最大请求次数为100w的 select操作,通过修改–num-threads可以获得不同并发线程数。
测试有索引和无索引这两种情况下的 QPS(QPS越大,系统性能越好), 每条sql平均执行时间(每条sql执行时间越小,系统性能越好), cpu负载,每组数据重复测试三次后取平均值,具体数据对比如下表所示:
后来,我仔细分析了linux 里面的cpu负载的含义,CPU负载显示的是一段时间内正在使用和等待使用CPU的平均任务数。不过,我也不好解释上述现象,只能列在这,供人参考。
小知识:
CPU负载怎么理解?是不是CPU利用率?
下面我们把cpu由8加到12,其他配置都不变,再进行压力测试,看有什么变化。
上表对应的QPS折线图如下所示:
上表对应的每条SQL执行时间折线图如下所示:
上表对应的cpu负载折线图如下所示:
下面我们把innodb buffer pool由24G升至44G,其他配置都不变,再进行压力测试,看有什么变化。
上表对应的每条SQL执行时间折线图如下所示:
io测试脚本:
[root@Mysql03 test]# cat iotest.sh
#!/bin/sh
set -u
set -x
set -e
for size in 2G ;do
for mode in seqrd seqrw rndrd rndwr rndrw;do
for blksize in 16384;do
sysbench --test=fileio --file-num=64 --file-total-size=$size prepare
for threads in 1 16 32 64 128 512 1024 2048;do
echo "====== testing $blksize in $threads threads"
echo PARAMS $size $mode $threads $blksize > sysbench-size-$size-mode-$mode-threads-$threads-blksz-$blksize
for i in 1 ;do
sysbench --test=fileio --file-total-size=$size --file-test-mode=$mode --max-time=180 --max-requests=100000000\
--num-threads=$threads --init-rng=on --file-num=64 --file-extra-flags=direct --file-fsync-freq=0\
--file-block-size=$blksize run | tee -a sysbench-size-$size-mode-$mode-threads-$threads-blksz-$blksize 2>&1
done
done
sysbench --test=fileio --file-total-size=$size cleanup
done
done
done
得到如下数据:
因为测试磁盘io会影响生产系统,所以只测试了上面几组数据,没有对顺序读、顺序写、顺序读写、随机读、随机写、随机读写等全面测试,即使测试可能意义也不大。
因为磁盘是机械硬盘,按理应该是220,上面出现1万的情况,因为硬盘有闪存。
有索引的qps在1万2左右,没索引的qps只有14,两者相差1000倍;
有索引的sql执行时间不论线程数是多少都不到一秒,而无索引的sql随着线程数的增加,其执行时间也会增加,最高到132s,相差倍数可是千倍万倍;
数据库的线程数达到128时,会使数据库性能明显下降;当增加cpu和内存时,也不能很好的解决这个问题,这可能是my.cnf和linux 内核参数配置的不合适导致,后期仔细研究这些参数,使数据库性能上一个新的台阶;
磁盘IO能力固定,只能从数据库和操作系统参数着手。
完