5年经验之谈 —— 性能测试中故障排查及解决方法!

引言: 在进行性能测试过程中,同事反馈报错率突然攀升。通过查看相关日志和服务器状态,发现了一些关键信息。本文将详细介绍导致报错率攀升的原因,并提供相应的解决方法。

1. 问题背景

在使用JMeter进行性能测试时,我们注意到报错率开始出现异常增长,这引起了我们的关注。为了找出问题所在,我们首先查看了Pinpoint监控和Nginx日志。

2. 分析结果

2.1 Pinpoint监控

从Pinpoint监控的反馈中,我们得到了以下错误信息:

502 Bad Gateway: "<html><EOL><EOL><head><title>502 Bad Gateway</title></head><EOL><EOL><body><EOL><EOL><center><h1>502 Bad Gateway</h1></center><EOL><EOL><hr><center>nginx/1.25.0</center><EOL><EOL></body><EOL><EOL></html><EOL><EOL>"

该错误表明网关出现问题,无法连接到上游服务器。进一步分析Nginx日志可以帮助我们了解更多情况。

2.2 Nginx日志

通过查看Nginx日志,我们发现大量的以下错误:

2023/08/24 15:27:36 [error] 1237#0: *2627178 no live upstreams while connecting to upstream, client: 192.168.0.98, server: , request: "GET /xxx/api/getxxx/Arxxx HTTP/1.1", upstream: "http://xxxserver/gaxxx/api/getxx/ArBxx", host: "192.168.0.96"

这些错误表明无法连接到上游服务器,并指向了一个具体的请求路径。进一步分析发现,无法连接的上游服务器为应用服务(192.168.0.98),而Nginx服务为192.168.0.96。

3. 问题定位与解决

通过以上分析,我们可以得出以下结论:

  • 报错率攀升是由于应用服务(192.168.0.98)无法连接到Nginx服务(192.168.0.96)引起的。
  • 应用服务日志未显示任何问题,因此需要进行更深入的排查。

3.1 线程转储操作

为了进一步分析问题,执行了线程转储操作。通过转储文件,发现大量的线程阻塞的情况。线程阻塞可能会导致应用程序无法正常处理请求,从而导致报错率上升。

Attaching to process ID 29674, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
Deadlock Detection:

No deadlocks found.

Thread 6572: (state = BLOCKED)
 - sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
 - java.util.concurrent.ForkJoinPool.awaitWork(java.util.concurrent.ForkJoinPool$WorkQueue, int) @bci=350, line=1824 (Compiled frame)
 - java.util.concurrent.ForkJoinPool.runWorker(java.util.concurrent.ForkJoinPool$WorkQueue) @bci=44, line=1693 (Compiled frame)
 - java.util.concurrent.ForkJoinWorkerThread.run() @bci=24, line=157 (Interpreted frame)

3.2 优化措施

将转储文件发送给相应的产品开发人员进行分析和优化非常重要。开发人员可以通过分析线程状态、锁竞争等信息来确定阻塞的原因。他们可以采取以下措施来解决问题:

  • 优化代码逻辑:检查应用程序是否存在性能瓶颈,如循环、数据库操作等。
  • 减少线程阻塞:通过使用异步操作、线程池等技术减少线程阻塞情况。
  • 调整系统资源配置:检查应用服务器的内存、CPU等资源配置是否合理,并进行相应调整。

4. 总结

对于性能测试中报错率攀升的情况,我们通过分析Pinpoint监控、Nginx日志和线程转储文件,定位了问题所在并提出了相应的解决方法。及时监控系统状态、分析日志、执行线程转储操作以及优化应用程序都是关键的步骤。通过这些措施,我们可以改善系统性能,并确保系统能够稳定运行。

在进行性能测试过程中,我们应该充分利用各种工具和技术,及时发现和解决问题,确保系统在高负载情况下仍能保持可靠和高效。只有这样,我们才能提供优质的用户体验,并为系统的持续发展奠定坚实的基础。

最后: 可以在我的VX公众号:【自动化测试老司机】免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!       

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值