1. 性能压测工具使用介绍
1)准备工作
工具:jmeter mac jdk
使用homebrew下载jmeter:brew install jmeter
mac终端使用jmeter,使用jmeter -v 查看版本,使用jmeter命令打开操作界面
使用jmeter还需要安装jdk,官网下载,本地安装即可
*如遇到jmeter无法保存测试计划时,可修改选项-外观-选择其他样式,默认样式有问题
2)测试计划
要求是N并发,达到M QPS,开始测试
不习惯英文,可在选项(Options)上设置语言
a. 创建线程组,设置线程数
b.添加http请求,设置URL和请求参数,如需设置header,则在线程组上添加http信息头部管理器
c. 添加响应断言,可设置成功返回200和失败返回500代码
d. 添加查看结果树,可以看到每一次请求的具体参数和返回,方便定位问题
e. 添加聚合报告(一般最后看指标都是在这)
一般情况下,添加以上就够了,保存测试计划后点执行即可在 查看结果树/聚合报告 中看到结果了。
f1. 对于API压测,需要设置随机参数,此时我们可以通过添加CSV数据文件设置配置文件(可以是csv格式,也可以是txt格式的)
在http请求中使用参数格式 ${参数名} 参数名是在csv的变量名称上设置的
f2. 如果要求到达吞吐量,可以添加常量吞吐量定时器,可以保证请求在这个并发量左右
f3. 如果要求严格并发,则可以添加同步定时器Synchronized Timer,设置并发数
如果使用了f2和f3,则需要设置线程组调度器,设置持续请求的时间
3) 聚合报告,我这里主要看吞吐量,99%响应时长
2. 性能压测问题定位经验总结
1)遇到的问题:
很容易遇到的问题都是connect refused/too many connections/connection reset by peer,这种说明大量的连接出现了阻塞,需要排查现有的tcp连接,最容易出现的是数据库连接数过多导致的超时和请求拒绝;如果其中有rpc连接,也可以排查一下是否有连接没有正常关闭(如果启用的是短连接);
目前解决方案都比较暴力:
如果短连接不好控制连接数,可以使用长连接,我这边使用的是go,go底层的rpc使用长连接,会使用锁,排队请求,所以只是会等待,除非等待超时;或者选用市面上已有的插件,如grpc;
数据库的连接是最容易爆的,最好使用连接池管理,我是使用的gorm,其实如果可以,尽量让请求打到redis上,redis的高并发完全可以接住!
2)定位问题
首先肯定是找错误日志,那如果连错误日志都没有,可以在几个关键节点(rpc调用/redis调用/mysql调用)上做mock返回,看问题出在哪里,再根据具体情况解决
另外 如果在本地调试,本地参数也需要进行变更:
在Mac进行性能测试可能存在系统资源限制,可以尝试以下命令:
sudo sysctl -w kern.ipc.somaxconn=2048 //修改最大连接数,默认128
sudo sysctl -w kern.maxfiles=12288 //修改读取文件最大值