概述
sysbench是基于LuaJIT的可以脚本化多线程基准。 它是一个模块化的、跨平台、多线程基准测试工具,最常用于数据库基准测试,但也可以用于创建不涉及数据库服务器的任意复杂工作负载。
sysbench附带了以下捆绑的基准测试:
- oltp_*.lua: 一个像数据库基准的oltp集合
- fileio: 文件系统级基准
- cpu: 一个简单的CPU基准
- memory: 内存访问基准
- threads: 基于线程的调度程序基准
- mutex: POSIX互斥基准
需求:基于物理机与虚拟机进行mysql数据库压测,对比两者性能。
ps:由于各方面原因,这里的物理机用的是机械盘,这里主要了解如何压测即可...
一、环境准备
MySQL数据库相关配置如下:
1、系统初始化
这里主要做一些标准化配置。
2、安装mysql8.0数据库
注意两边环境mysql配置保持统一。
ps:建议像这种基本总要部署的应用、数据库之类重复性工作,能自动解决就自动解决吧,每次折腾个半天也是很浪费时间的..
3、建库
有兴趣的话也可以改下lua脚本。
##因为lua脚本里面这里设置的就是sbtest库,库名需要与脚本里的内容保持一致
create database sbtest;
4、安装sysbench
wget https://codeload.github.com/akopytov/sysbench/tar.gz/1.0.18
yum -y install gcc gcc-c++ make automake libtool pkgconfig libaio-devel
tar -xvf sysbench-1.0.18.tar.gz
cd sysbench-1.0.18/
./autogen.sh
./configure --prefix=/usr/local/sysbench/ --with-mysql --with-mysql-includes=/usr/include/mysql \
-with-mysql-libs=/usr/lib64/mysql && make && make install
echo "export PATH=$PATH:/usr/local/sysbench/bin" >> /etc/profile
source /etc/profile
5、数据准备
建议20张表以上压测..
--准备8张表,每张表2000万数据
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=xxx34 \
--test=/usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp_tables_count=8 \
--oltp-table-size=20000000 --num-threads=50 --rand-init=on prepare
二、压测场景--对比CPU为40核,innodb buffer pool为96G时数据库在物理机与虚拟机的性能差距
1、并发为200
###################################执行run###############################################
--num-threads=200 //200个并发连接
--max-time=300 //测试时间为300s
--report-interval=3 //报告打印周期为3s
--oltp-read-only=off //非只读操作测试
--max-requests=0 //最大执行次数这里不做限制,只由max-time进行限制
#########################################################################################
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=fxxx34 \
--test=/usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp_tables_count=8 \
--oltp-table-size=20000000 --num-threads=200 --oltp-read-only=off --report-interval=3 --rand-type=uniform \
--max-time=300 --max-requests=0 --percentile=95 run >> /tmp/200_threads_sysbench.log
###################################执行清除##################################################
★重点关注:总的事务数,每秒事务数TPS,QPS,时间统计信息(最大、最小、平均、99%以上语句响应时间)★
############################################################################################
sysbench --mysql-host=xxx--mysql-port=3306 --mysql-user=root --mysql-password=xxx34 \
--mysql-db=sbtest --oltp-tables-count=8 --oltp-table-size=20000000 --num-threads=16 --max-requests=0 \
--max-time=30 --report-interval=1 --test=/usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua cleanup
这里针对输出做个简单说明(注意加粗部分):
read: xxx //读总数,select语句
write: xxx //写总数,insert、delete、update语句
other: xxx //其它语句,如commit等
total: xxx //总的执行语句数
transactions: xxx (xxx per sec.) //总的事务数(★每秒处理事物数:TPS★)
queries:: xxx (xxx per sec.) //读写请求次数(★每秒的读写次数:QPS★)
total time: xxx s //总时间
total number of events: xxx //★事务总数★
min: xxx ms //最小延迟时间
avg: xxx ms //平均延迟时间
max: xxx ms //最大延迟时间
95th percentile:: xxx ms //95%语句执行时间
Threads fairness: //线程公平性
events (avg/stddev): xxx/xxx //平均每个线程完成envet的次数,后一个值是标准差
execution time (avg/stddev): xxx/xx //平均每个线程平均耗时,后一个值是标准差
2、并发为400
systemctl restart mysqld
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=xxx34 \
--test=/usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp_tables_count=8 \
--oltp-table-size=20000000 --num-threads=400 --oltp-read-only=off --report-interval=3 --rand-type=uniform \
--max-time=300 --max-requests=0 --percentile=95 run >> /tmp/400_threads_sysbench.log
3、并发为600
systemctl restart mysqld
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=xxx34 \
--test=/usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp_tables_count=8 \
--oltp-table-size=20000000 --num-threads=600 --oltp-read-only=off --report-interval=3 --rand-type=uniform \
--max-time=300 --max-requests=0 --percentile=95 run >> /tmp/600_threads_sysbench.log
4、并发为800
systemctl restart mysqld
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=xxx34 \
--test=/usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp_tables_count=8 \
--oltp-table-size=20000000 --num-threads=800 --oltp-read-only=off --report-interval=3 --rand-type=uniform \
--max-time=300 --max-requests=0 --percentile=95 run >> /tmp/800_threads_sysbench.log
5、并发为1200
systemctl restart mysqld
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=xx234 \
--test=/usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp_tables_count=8 \
--oltp-table-size=20000000 --num-threads=1200 --oltp-read-only=off --report-interval=3 --rand-type=uniform \
--max-time=300 --max-requests=0 --percentile=95 run >> /tmp/1200_threads_sysbench.log
三、基于压测结果汇总统计
1、结果统计
如下表:
》》这里针对几个重要指标转换如下:
2、简单分析如下:
2.1、虚拟机和物理机基于并发数在处理的事务总数比较
从事务数折线图可以看出,当sysbench的并发测试线程数达到600时,此时虚拟机上MySQL的性能得到了充分的发挥,虚拟机mysql数据库在规定时间内处理的事务总数在169万左右,如果继续增加并发测试线程数,虚拟机mysql数据库在规定时间内所处理的事务总数稍有下降,但是还在150万左右,整体还是不错的。
而物理机mysql数据库随着并发线程的增加所处理的事务总数也在逐步增加,在线程数达到1200时物理机mysql数据库在规定时间内所处理的事务总数达到了75万左右,同等条件下,对比物理机机械盘,可以看出虚拟机mysql数据库的性能更高。
2.2、虚拟机和物理机基于并发数在QPS的比较
从QPS折线图可以看出,当sysbench的并发测试线程数达到600时,此时虚拟机上MySQL的性能得到了充分的发挥,虚拟机mysql数据库的QPS在11万左右,如果继续增加并发测试线程数,虚拟机mysql数据库的QPS稍有下降,但是还在10万左右,还是不错的。
而物理机mysql数据库随着并发线程的增加QPS也在逐步增加,在线程数达到1200时QPS达到了5万左右,同等条件下,对比物理机机械盘,虚拟机mysql数据库的性能更高。
2.3、虚拟机和物理机基于并发数在平均延迟时间的比较
从平均延迟时间折线图可以看出,虚拟机上的数据库和物理机上的数据库sql平均延迟时间均随着并发线程的增加也在逐步增加,同等条件下,对比物理机机械盘,虚拟机mysql数据库平均延迟时间显得更短。
2.4、虚拟机和物理机基于并发数在95%sql语句执行时间的比较
从95%sql语句执行时间折线图可以看出,虚拟机上的数据库和物理机上的数据库95%sql语句执行时间均随着并发线程的增加也在逐步增加,同等条件下,对比物理机机械盘,虚拟机mysql数据库95%sql语句执行时间显得更短。
以上压测过程中实际上cpu平均基本不到80%,内存使用基本不到60%,主要的性能差异其实是在磁盘IO上,有兴趣的朋友可以针对物理机和虚拟机硬盘的随机读、随机写、随机读写、顺序写、顺序读、顺序读写等所有模式的iops、吞吐量做进一步测试。
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下!
本文暂时没有评论,来添加一个吧(●'◡'●)