大量504问题排查
今天是问题百出的一天。
在早上产品巡检的过程中,有巡检部门的同事发现某一产品域名下的监控大量的504.
在我得到这一消息的时候本能的反应:“这是不是有别的服务在违规运行导致内存不止引发的内存异常”。所以立即联系相关部门确认是否存在部署的有其他服务,没有按照规则释放用户连接导致的问题。得到的结果是并没有像我想象的那样是其他人的服务导致的问题。
所以立即集中精神回到问题中,去排查。
1.查看产品日志记录,请求失败,数据库连接异常
2.查看数据库发现用户连接数超过限制数
3.回到IIS中查看工作进程中对应的应用程序池的请求队列发现有一堆堵塞请求
三个方面实锤了这个问题出现在我自己的身上。所以下一步尝试在测试环境复现问题。
4.打开jmeter,将外网报504错误的部分请求在jmeter中创建
5.设置jmete线程组从1个线程开始模拟
6.在jmeter对测试环境发送请求的过程中,附加应用到进程调试,使用诊断工具查看测试环境下的现象是否能够复现生产环境下的问题
从诊断工具中可以看到在程序运行过程中的事件、内存,以及CPU的变化状态。并通过截取快照查看在托管内存中具体对象的分布情况。
如下:
在停止收集数据得到的分析报告中,能够明确地看到,对应的CPU使用率和事件的详细信息。其中CPU使用率如下:
从图中看出,它明确的表示出了本机代码,外部调用,外部代码对应的CPU总计和自CPU,及其它的占比。
在图示的右侧有关于前5个类比的占比饼图。
对于这个CPU总计和自CPU,如果第一次接触的话可能不太明白,但是从字面意思上来看,也能猜测个八九不离十。其中CPU总计,来自于 TOTAL CPU ,而自CPU则来自于 Self CPU。从以下的官方描述中就能很明显得看出区别。
Total CPU:The milliseconds and CPU percentage used by calls to the function, and functions called by the function, in the selected time range. This is different from the CPU Utilization timeline graph, which compares the total CPU activity in a time range to the total available CPU.
Self CPU:The milliseconds and CPU percentage used by calls to the function in the selected time range, excluding functions called by the function.
CPU总计是指在选择的时间范围内采集的样本中计算出的函数及其它调用函数所用的毫秒数和百分比。
而自CPU相对来说,就是排除了调用的函数,也就是 excluding functions called by the function 的明确表达。
这部分内容可以参考官方的文档,最好还是记一下这个地址,因为如果用的时候,可能不好找。
(图片来自:docs.microsoft.com/en-us/visua…
其中中文是这么解释的,它看起来比较拗口,可能还更容易给人搞蒙:
(图片来自:docs.microsoft.com/zh-cn/visua…
通过排名考前的函数中查看最终发现的问题是在数据库连接的地方占用的CPU资源逐渐增加。
带着这种在监控指标得到的现象回到业务中检查发现是程序中的数据库连接部分,在发起请求后创建连接,并且session结束没有对连接进行释放,所以导致数据的连接数持续暴增,居高不下,导致数据库承载的压力逐渐增大,web层的请求一直排队无法得到有效处理而导致巡检过程中发现大量的504。
以上就是一次简单的问题排查过程。
分析总结
其中涉及到的思路,再做一下简单的总结:
- 查看监控现象
- 带着问题排查生产环境下的相关架构,确定是不是你的服务导致,避免排查半天发现不是自己的问题
- 确认问题后带着问题去查看记录的相关日志
- 测试环境或者开发环境下尝试复现
- 复现问题后,结合工具进行分析,比如用到的jmeter、visualstudio(这里根据你的应用选择jprofiler、visualvm或者其他的工具)
- 查找定位问题并修改解决
这几条是解决问题的思路。另外,再分享一个很实用搜索相关文档的技巧。这个因为它是在搜索引擎优化的时候会用到的内容,所以很多同学可能不了解。
实用小技巧
就像前面提到的visual studio 的性能探查器的使用方法一样,如果你没用过,需要去查一下它怎么用可能很难去找到对应的准确说明文档。
可以通过在百度的搜索框中输入 inurl:docs.microsoft.com CPU总计 自CPU ,如果发现结果不对的情况下可以进行调整 inurl:docs.microsoft.com Total CPU Self CPU 。
通过这种方式可以缩小检索范围,更精确的得到我们需要的结果。这个在其他的域名中同样使用,不论是vuejs,还是 Oracle 等,它限定在指定 url 中搜索你想要的资源。
最后在附上一个 visual studio 评估应用性能的文档入口,如下: