缘起
最近在优化一个慢请求,该请求一般人访问的话还可以,但是用户的访客多的情况下会很慢.
相关信息如下表格所示:
请求数 | 耗时 | 平均耗时 | 最长耗时 | 接口 |
---|---|---|---|---|
997 | 232.4280 | 0.2331 | 5.4610 | v1-whovme-who_view_me |
最长耗时达到 5 秒半,这是不能够忍耐的.
经过分析请求的流程,发现在该请求中有多处循环查询的sql,更有甚者,在内层循环里进行内网接口调用!而这正是慢查询的根本原因.
针对这个优化方案是,将循环里面的查询语句提取出来整合成一个;至于内层循环的接口调用则更换另一种方案来处理,这里不在深入讨论.
sql 整合完之后,和原来的 sql 查询性能对比如下:
单个查询耗时 : 0.026 sec
整合查询耗时 : 0.036 sec
整体的查询性能,假设是有 20 次循环, 不考虑网络请求的损耗
单个查询耗时 0.026 * 20 = 0.52
整合查询耗时 0.036
两者相差 14 倍,合并查询优于多个查询 !
目前看来很顺利,但是这只是单个查询的情况,如果是并发查询的场景下,这个整合后的效果是不是依然良好呢?
整合后的查询语句,其所需要消耗的资源相对单个查询是有所增加的,所以可不能贸然更新上线,需要进行压力测试对比分析才行.
Jmeter
经过了前面的场景铺垫,终于到主角出场了.
Jmeter 是 Apache 提供的一款功能性比较全的性能测试工具,可以使用来对 HTTP / SQL / SOAP 等应用进行测试.
这里使用了 Jmeter 的 SQL 测试功能.
注意: 本文章相关操作对应的是 Ubuntu 16.04 的操作系统.
下载安装
到下载页面下载 Jmeter 安装文件 apache-jmeter-5.2.1.tgz
该文件下载之后不需要在编译安装,可以直接启动,启动命令是 ./bin/jmeter
但是要链接操作数据库的话,还是要下载文件 mysql-connector-java-5.1.48.tar.gz ,下载文件解压后,将 mysql-connector-java-5.1.48-bin.jar
拷贝到 Jmeter 文件目录的 ./lib/
下,需要重启 Jmeter 应用才能生效.
配置
要完成 SQL 压力测试,需要进行如下配置才行:
- 配置数据库链接
- 配置需要压测的 SQL 语句
- 配置结果查看方式
具体的配置操作可以参考这边文章,虽然界面有所区别,但也不影响理解操作
压力测试
配置完成后就可以进行测试了
测试信息
线上只读测试库进行的测试
并发用户数: 50
每个用户请求数: 3 次
即并发模拟 50 个用户进行 3 次查询
类型 | 请求次数 | 平均耗时(ms) | 最小耗时(ms) | 最大耗时(ms) |
---|---|---|---|---|
单个查询 | 150 | 349 | 10 | 1239 |
整合查询 | 150 | 348 | 48 | 1844 |
可以看出,语句进行整合之后,和原来的单个查询的并发能力相差并不大,可以按这方法进整合优.
最后
既然压力测试结果显示改写后的性能差别不大,那就可以淡定的优化上线了
本文作者: chenishr
本文标题:《SQL压测工具 Jmeter》
本文地址: http://blog.chenishr.com/?p=807
©版权所有,除非注明, 永在路上文章均为原创,转载请以链接形式注明出处和作者细信息。