一 为什么要对新申请的MySQL服务器压测
新申请的机器我们是不知道性能的,系统上线之前,我们需要知道数据库的性能,从而在系统部署之后的压测中,判断系统的性能是高于还是低于数据库性能,从而确定瓶颈或者性能问题是在系统还是在数据库。比如数据库的QPS是2000,可能应用系统的QPS才500.
二 数据库压测性能指标有哪些
2.1 IOPS: 随机IO并发处理能力,比如200IOPS
2.2 吞吐量: 磁盘每一秒中可以读写多少字节数据量, 比如redo log受吞吐量影响
2.3 延迟:往磁盘写一条数据的延迟
2.4 CPU负载
假设你数据库QPS3000,可能其他性能指标正常,但是CPU负载特别高,100% 以上,那么也说明数据库不能继续往下压测更高的qps
2.5 网络负载
在机器带宽一定的条件下,压测到一定的QPS和TPS的时候,每一秒钟的网卡会输出多少数据,会输入多少数据,有可能你的网络带宽最多每一秒传输100MB数据,那么你QPS到1000的时候,网卡就打满了。千兆网卡,每一秒最多传输128M,实际可能不到128M
三 数据库压测工具-sysbench
3.1 安装sysbench
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
sysbench --version
3.2 创建测试库、测试账号用户名和密码
CREATE DATABASE IF NOT EXISTS testdb;
# 允许本机以外其他主机连接
CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'test_user';
# 允许本地主机连接
CREATE USER 'test_user'@'%' IDENTIFIED BY 'test_user';
# 给test_user用户授予testdb数据库所有权限
GRANT ALL ON testdb.* TO ' @'localhost' IDENTIFIED BY 'test_user';
3.3 基于sysbench构造测试表和测试数据
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=localhost --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=testdb --mysql-socket=/usr/local/mysql/tmp/mysql.sock --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare
--db-driver=mysql 数据库驱动,如果是mysql,则是mysql驱动
--time=300 连续访问300秒
--threads=10 用10个线程模拟并发访问
--report-interval=1 每隔1秒输出一下压测情况
--mysql-host=127.0.0.1 连接哪一个主机
--mysql-port=3306 端口
--mysql-user=test_user 账号
--mysql-password=test_user 密码
--mysql-db=testdb 指定数据库
--tables=20 创建多少表
--table_size=1000000 每一个表创建多少记录
oltp_read_write 执行oltp数据库的读写测试
prepare 表示开始构造表和数据,为压测做准备
3.4 sysbench开始测试,并分析各个指标
3.4.1 top命令查看内存和CPU状态以及CPU负载
top - 18:38:57 up 3:25, 6 users, load average: 4.78 2.93 1.64
load average:表示CPU在1分钟 5分钟 15分钟的负载情况
Mem: 16331952k total, 6372140k used, 9959812k free, 141864k buffer:
表示内存负载情况: 当前内存15g内存,使用了6G,还剩10G左右,然后138M左右是内核缓冲区
%CPU: 表示CPU当前的使用率 在70-80%下是可以接受的
%MEM: 表示当前进程占用内存百分比
3.4.2 每一秒输出的压测报告
[ 251s ] thds: 10 tps: 336.11 qps: 6723.16 (r/w/o: 4705.52/1345.43/672.22) lat (ms,95%): 71.83 err/s: 0.00 reconn/s: 0.00
thds:表示线程数
qps: 每一秒查询SQL的数量
tps: 每一秒处理事务的数量
lat: 延迟时间
err/s: 每一秒错误
3.4.3 压测完毕后的报告
SQL统计:
3.4.4 磁盘I/O吞吐量
比如上图所示:磁盘每一秒读取6M, 24M 16M, 每一秒写入2M、20M、22M,普通机械硬盘可以达到每一秒几百兆
3.4.5 查看随机IO读写指标
比如上图,读IOPS是1182,即随机磁盘读取每一秒钟多少次;写IOPS是946,随机磁盘写每一秒钟多少次,随机磁盘读写每一秒在2-300是可以承受的,但是不能更低
3.4.6 压测试观测网卡流量情况
这个说的就是每秒钟网卡接收到流量有多少kb,每秒钟通过网卡发送出去的流量有多少kb,通常来说,如果你的机器使用的是千兆网卡,那么每秒钟网卡的总流量也就在100MB左右,甚至更低一些。