前置知识:压力测试的常见指标
为什么要进行压测?
拿到一台MySQL服务器之后,开发业务之前,第一步应该就是对它进行压测,就可以清楚的知道这台机器的性能怎么样,可以支撑多少的TPS,QPS,这台机器的真实性能是怎么样的了。在业务开发完成后进行的压测,可以用来对比,实际的业务性能和机器的性能的差距了,就可以知道有多少可以优化的空间了。
如何进行压测?
基准测试可以使用一款压测工具进行压测:sysbench 。sysbench可以在数据库内构造大量的测试数据,也可以模拟大量的线程,发起大量的SQL去访问数据库。
安装sysbench
在Linux上,执行以下命令即可安装:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bashsudo yum -y install sysbench#验证是否安装成功sysbench --version
使用sysbench可以构建任意个表,然后发起任意的请求来进行测试。
使用sysbench进行压测
直接执行sysbench的命令就可以进行压测了,下面展示一个例子:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --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=test_db :目标数据库
—tables=20 :构建的表的数量;这里表示创建20个数据表
—table_size=1000000 :每张数据表的数据量; 这里表示每张数据表有100万条数据
oltp_read_write :表示读写模式,测试读写性能,一般就使用这个模式。
另外还有几种模式如下:
oltp_read_only : 测试只读性能
oltp_write_only : 测试写入性能
oltp_delete : 测试删除性能
oltp_insert : 测试插入性能
oltp_update_index : 测试更新索引字段性能
oltp_update_no_index : 测试更新非索引字段性能
—db-ps-mode=disable :禁止ps模式
prepare : 这里表明当前这行命令是准备数据,不是执行压测。另外还有几种命令
run : 执行压测
clean:清理数据
上面的命令只是执行了数据准备,如果需要执行压测,执行完 prepare 后,然后将上面的命令最后的 prepare 替换成 run 。执行run压测后,每秒会输出压测的情况如下:
[ 2s ] thds: 10 tps: 530.13 qps: 10616.58 (r/w/o: 7423.80/2132.52/1060.26) lat (ms,95%): 34.33 err/s: 0.00 reconn/s: 0.00
输出日志的各个部分解析:
[ 2s ] :表示第几秒;这里2表示这个是第2秒输出的日志。
thds: 10 : 表示当前使用的线程数;这里表示当前有10个线程在运行。
tps: 530.13 :执行的事务数量; 这里表示每秒执行530.13个事务。
qps: 10616.58 (r/w/o: 7423.80/2132.52/1060.26) :执行的请求数量,括号里面的是具体的请求的类型;这里表示每秒有10616.58个请求在执行,有7423.80个读请求,2132.52个写请求,1060.26个其他请求。
lat (ms,95%): 34.33 :代表95%的请求都在34.33毫秒以下完成。
err/s: 0.00 :每秒错误数,当前是0个。
reconn/s: 0.00 :每秒重新连接数量,当前0个。
测试报告
压测结束后,会输出一个测试报告,报告内容解析如下:
SQL statistics:queries performed:read: 193550 #一共执行了19w多的读请求write: 55300 #一共执行了5w多的写请求other: 27650 #一共执行了2w多的其他请求total: 276500 #一共执行了27w多的请求transactions: 13825 (460.18 per sec.) #一共执行了1w多个事务,每秒执行460.18个事务queries: 276500 (9203.64 per sec.) #一共执行了27w多个请求,每秒执行9千多个请求ignored errors: 0 (0.00 per sec.) #一共发生的错误请求数量reconnects: 0 (0.00 per sec.) #一共发生的重新连接数量General statistics:total time: 30.0413s #一共执行了30多秒total number of events: 13825 #一共执行了1w多个事务Latency (ms):min: 2.99 #请求中延迟最小的是2.99毫秒avg: 21.71 #请求中平均21.71秒能执行完成max: 73.47 #请求中延迟最大的是73.47毫秒95th percentile: 39.65 #95%的请求都能在39.65毫秒内执行完成sum: 300169.88 #一共执行了300多秒Threads fairness:events (avg/stddev): 1382.5000/9.68 #平均每个线程能处理完1382个event,标准差为9.68execution time (avg/stddev): 30.0170/0.02 #平均每个线程执行了30秒,标准差为0.02
