一、服务器准备
操作系统:CentOS 7
CPU:8核
内存:32GB
硬盘:500GB
数据库:MySQL 5.7
二、安装sysbench
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
yum -y install sysbench
查看安装结果:sysbench --version
三、数据库准备
-- 创建数据库
CREATE DATABASE sbtest;
-- 创建用户
create user 'sbtest'@'%' identified by 'Sbtest123456#';
GRANT ALL PRIVILEGES ON *.* TO sbtest@'%' IDENTIFIED BY 'Sbtest123456#' WITH GRANT OPTION;
FLUSH PRIVILEGES ;
四、使用sysbench进行基准测试
1.基于sysbench构造测试表和准备数据
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sbtest --mysql-password=Sbtest123456# --mysql-db=sbtest --tables=20 --table-size=1000000 oltp_read_write --db-ps-mode=disable prepare
参数说明:
(1)–db-driver=mysql : 表示基于mysql的驱动连接mysql数据库
(2)–time=300:表示连续访问300秒
(3) --threads=10:表示用10个线程模拟并发访问
(4) --report-interval=1:表示每隔1秒输出报告
(5)–mysql-host=127.0.0.1 --mysql-port=3306 : 表示数据库的IP和端口
(6)–mysql-user=sbtest --mysql-password=Sbtest123456# :表示数据库用户名和密码。
(7)–mysql-db=sbtest: 表示数据库实例
(8) --tables=20:表示创建20个表,默认表名为数据库实例名XX,例如sbtest1
(9)–table-size=1000000:表示每个表插入1000000行数据
(10) oltp_read_write:表示执行oltp数据库的读写测试
(11)–db-ps-mode=disable :表示禁止PS模式
(12)prepare:表示准备数据
测试结果:
2.测试MySQL的读写TPS
sysbench --db-driver=mysql --time=100 --threads=50 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sbtest --mysql-password=Sbtest123456# --mysql-db=sbtest --tables=20 --table-size=1000000 oltp_read_write --db-ps-mode=disable run
测试结果:
[ 10s ] thds: 10 tps: 449.00 qps: 8990.00 (r/w/o: 6291.00/1597.00/1102.00) lat (ms,95%): 86.00 err/s: 0.00 reconn/s: 0.00
压测统计报告说明:
(1) thds: 10 表示10个线程在压测
(2)tps: 248.00 表示TPS为248每秒
(3)qps: 4957.99表示每秒可以执行4957.99个请求
(4)r/w/o: 3476.99/985.00/496.00 表示每秒有3476.99个读请求,985.00个写请求,496.00个其他请求。
(5)lat (ms,95%): 101.13 表示95%的请求延迟在101.13毫秒以下
(6) err/s: 0.00 reconn/s: 0.00 表示每秒有0个请求是失败的,发生了0次网络重连
SQL statistics:
queries performed:
read: 64736 // 执行了64736次读请求
write: 16276 // 执行了16276次写请求
other: 11468 // 执行了11468次其他请求
total: 92480 // 总共执行了92480次请求
transactions: 4624 (460.41 per sec.) // 总共执行了4624次事务,TPS为460.41
queries: 92480 (9208.17 per sec.) // 总共执行了4624次请求,QPS为:9208.17
ignored errors: 0 (0.00 per sec.) // 0次错误
reconnects: 0 (0.00 per sec.) // 0次重连
General statistics:
total time: 10.0415s // 总执行时间10.0415秒
total number of events: 4624 // 总事件4624个
Latency (ms):
min: 3.38 // 最低时延3.38秒
avg: 21.67 // 平均时延3.38秒
max: 293.01 // 最高时延 293.01秒
95th percentile: 86.00 // 95%的时延 86.00秒以下
sum: 100215.56 // 总时延100215.56秒
Threads fairness:
events (avg/stddev): 462.4000/14.64
execution time (avg/stddev): 10.0216/0.01
3.测试MySQL的只读性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sbtest --mysql-password=Sbtest123456# --mysql-db=sbtest --tables=20 --table-size=1000000 oltp_read_only --db-ps-mode=disable run
4.测试MySQL的删除性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sbtest --mysql-password=Sbtest123456# --mysql-db=sbtest --tables=20 --table-size=1000000 oltp_delete --db-ps-mode=disable run
5.测试MySQL的更新索引字段性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sbtest --mysql-password=Sbtest123456# --mysql-db=sbtest --tables=20 --table-size=1000000 oltp_update_index --db-ps-mode=disable run
6.测试MySQL的更新非索引字段性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sbtest --mysql-password=Sbtest123456# --mysql-db=sbtest --tables=20 --table-size=1000000 oltp_update_non_index --db-ps-mode=disable run
7.测试MySQL的插入性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sbtest --mysql-password=Sbtest123456# --mysql-db=sbtest --tables=20 --table-size=1000000 oltp_insert --db-ps-mode=disable run
8.测试MySQL的写入性能
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sbtest --mysql-password=Sbtest123456# --mysql-db=sbtest --tables=20 --table-size=1000000 oltp_write_only --db-ps-mode=disable run
五、监控服务器性能
我们在通过sysbench压测时,可以通过–threads=xxx来调整线程数,同时监控服务器性能。
1、查看CPU负载
通过top命令,观察CPU负载
top - 20:38:22 up 37 days, 23:52, 3 users, load average: 2.00, 7.00, 4.09
在load average中,可以看到CPU负载情况,如果当前服务器是8核,那么在压测的过程中,load average不要超过8。
2、查看内存负载
同样通过top命令,可以观察内存负载
KiB Mem : 32780160 total, 241868 free, 28429752 used, 4108540 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2146104 avail Mem
一般压测过程中,内存的消耗不要超过总内存的80%。
3、观察磁盘IO情况
通过dstat -d命令,查看磁盘IO情况,如果dstat命令不存在,则需要先按照dstat,可以通过yum install -y dstat进行安装。
[root@develop ~]# dstat -d
-dsk/total-
read writ
28k 153k
0 12k
0 12k
8192B 864k
一般机械硬盘的磁盘IO可以达到几百兆,这个要具体硬盘性能。固态硬盘的磁盘IO可以达到几GB。
4、观察IOPS
通过dstat -r命令,可以查看磁盘IOPS,也就是每秒进行多少次读IO、多少次写IO。
[root@develop ~]# dstat -r
--io/total-
read writ
0.58 4.63
0 5.00
0 3.00
0 3.00
一般机械硬盘的IOPS可以达到每秒几百,固态硬盘可以达到几千。
5、观察网卡压力
通过dstat -n命令,可以查看网卡流量。
[root@develop ~]# dstat -n
-net/total-
recv send
0 0
49k 33k
70k 53k
59k 42k
43k 27k
48k 32k
62k 47k
一般如果是千兆网卡,则读写流量可以达到128MB,这个取决于网卡带宽。