根据这个描述,基本可以排除客户端以及网络因素,需要重点关注服务端的状态。
我们系统服务端的架构如下图:
接下来就要根据这个架构由前往后一层一层排查。
2、检查HAProxy
重点排查HAProxy当前是否可用,负荷是否超标,包括下面的一些指标。
| 排查项 | 结果 |
| — | — |
| CPU是否正常 | 正常 |
| 内存是否正常 | 正常 |
| 线程数是否超过配置上限 | 正常 |
| 连接数是否超过配置上限 |
正常
|
排查之后发现一切正常,与版本更新前的数据作比较,也没有出现大幅度波动。
而在查看请求日志时,发现大量500错误信息,说明HAProxy出异常的可能性较小,错误更可能来自HAProxy之后的环节。
3、检查Jetty
重点排查jetty的配置信息。
| 排查项 | 结果 |
| — | — |
| 配置是否有变动 | 正常 |
| 应用占用的线程数是否超过上限 | 正常 |
| 应用占用的线程数是否超过上限 | 正常 |
虽然jetty配置信息检查正常,但是在access.log中存在大量500错误,定位到这里,有两种可能的原因:
应用代码逻辑问题。部分异常信息没有被拦截住,直接抛给Jetty,导致500错误。
Jetty逻辑问题。请求没有到达应用,而是由于Jetty自身的某些逻辑导致请求被直接返回了。
4、检查应用
为了验证是否第一个原因,我们继续走查了应用代码,发现所有的异常都被正确处理了,不存在继续往上抛的情况。另外,也检查了图片保存的代码,确认文件连接都正确释放了。
因此,由于应用逻辑问题导致错误的可能性很小,那么第二个原因的嫌疑最大,就是Jetty逻辑问题。
如果直接排查Jetty的源码,太费时费力,这个时候最好的办法是实时抓包,看看Jetty和应用服务之间到底发生了什么。
5、使用tcpdump抓包
使用tcpdump命令抓取从jetty到应用服务之间所有的数据包,将结果输出到临时文件中。
tcpdump -i eth0:0 -s0 host 1X.XXX.XXX.XX -w /tmp/out1.cap
使用wireshark打开out1.cap文件,查找出现500错误的数据包,然后很意外的看到了下面的逻辑。
通过这段代码我们发现,jetty对于请求数据的大小做了限制,超过200000 byte的时候就会报错,返回错误码500。
App这次更新后,上传了很多大于200000 byte的图片,于是便出现了大量的500错误。
找到问题根源,修正起来就很简单了,在WEB-INF目录下添加jetty-web.xml 文件解决,文件内容如下:
<?xml version="1.0"?><Configure id="WebAppContext"class=“org.eclipse.jetty.webapp.WebAppContext”>
<Set name="maxFormContentSize"type=“int”> 0
6、总结
出现Internal server error 500错误,往往意味着服务端出现一些未知异常,但是在排查的时候我们不能仅仅只是关注应用服务,而是要关注从服务端接收请求开始,一直到应用服务的整条链路。
以本文中的情景为例,就是从HAProxy 到 Jetty 再到 应用服务,中间的任何一个环节都有可能导致500错误。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-9YQRjl77-1712730127563)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!