背景:公司app进行推广需要先对接口进行压测,找出瓶颈,进行优化。
工具:腾讯云压测大师,三台服务器服务器、MySQL、mongodb、redis都是镜像生产环境。
操作步骤:
1. 将生产环境环境代码部署在压测环境
2. 修改配置文件中MySQL、mongodb、redis连接(账号、密码修改为压测环境)
3. 创建压测中需要用到的账号(需要用到usertoken),先将数据导入到mongodb和redis,保证在接口运行时能找到此用户
4. 在腾讯云-压测大师中创建用例:接口从50压至200,按照50间隔上增,持续并发5分钟
5. 设置服务器监控和检测点(监控三台服务、检测点为返回code=200)
6. 执行接口压测用例
如图:
结果:
1. 在压测过程中发现TPS只有两百左右,平均响应时间都在三百ms以上,但是服务器的性能从监控上来看无问题,尝试修改方案:修改tomcat最大连接数,修改mongodb、mysql的最大连接数。
a. 进入tomcat配置文件中,修改参数,参考文档https://www.cnblogs.com/laojiao/p/9575383.html:
2. 压测过程中还出现连接超时现象,尝试修改方案:修改连接超时最大时间。
3. 尝试以上修改之后重新压测发现TPS和平均响应时间并未发生太大改变,然后就问了有经验的测试大佬(当然是以前带我的morty同学),叫我把GC日志打开查看一下GC日志是或正常,然后就开启GC日志,参考文档https://www.jianshu.com/p/d1f5916d5548(morty同学提供的,哈哈):
4. 开启GC日志进行压测之后,发现都是Allocation Failure,没有看到full gc,找开发看也没看出个所以然,好绝望!
5. 查看后台日志,发现一个请求发出到收到想要的时间都在一百ms左右,也不长,为什么在压测大师上就变成了三百多ms,怀疑是模拟客户端发送请求和接收请求时耗时太长,尝试解决方法,利用jmeter在内网压测,不过压测结果还是不理想,响应时间还是没降低,而且并发数在100的时候user服务出现无响应情况
6. 在网上找了平均响应时间长的决解方法,修改jvm和tomcat配置文件还是有问题,有些接口在并发100的时候user服务无响应,但是进程还存在
7. 找运维,运维同学说在压测的时候无响应时将堆栈信息打印出来,尝试方法:继续压测当服务无响应时打印出堆栈信息:
8. 将打印出来的信息给开发,发现请求在查询redis用户信息时一直在等待中,查看redis的最大连接数只有50,但是设置的不止这个数,开发就查看代码,发现代码里面没有去读取配置文件里面的连接数而只是默认给了一个值为5,导致连接数太小一直等待,出现超时、平均想要时间过长现象。
9. 修改代码重新压测,有两台服务器出现:
10. 网上查阅资料,等待的释放时间太长,调用端口释放之后需要等待30s,解决方案(按照网上方法):
10. 经过以上修改,再次进行压测,并发数为200时,TPS达到两千多,平均响应时间为80ms左右,基本已达标
11. 增加并发数,找到瓶颈,本次压测经过不晓得多少天(中间经过两次发版耽搁了一些时间),总算是完成。
感谢本次压测过程中帮助的朋友!