一、问题背景
118机器出现接口不通报警,一段时间后恢复
二、502可能的原因
1、后端服务挂了
这种表现是立即502,不会出现请求一会之后502,比如上次VPS的cron三台都内存溢出了,虽然进程在,但是日志不打印了。
2、后端响应非常慢(这个可能不是502,而是504,再研究下)
这种主要就是后端服务有压力,导致迟迟不能响应。对于这种现象,主要从后端压力角度去排查
3、请求被丢弃了
tomcat一般会有一个接收队列,如果满了,就会丢弃,这种印象中好像是几秒之后502
三、排查过程
1、确认问题:nginx大量502异常,即nginx对应的后端服务可能处理很慢或者将请求丢弃了。
2、检查118机器的cpu,内存,网络等基础指标,发现eth0这段时间入口流量骤减,几乎为0,而且出问题的几天,时间吻合,其它指标正常,说明流量减少一定是问题的一个主要突破口。
3、eth0网络入口流量为0,有两种可能:1、网络问题导致机器不通;2、tomcat服务负载太高,导致新的socket请求连接被拒绝;
4、检查网络:发现本机的ping检测无丢包现象,另外,同个机房的其它机器也都没有丢包的情况,那么网络问题就可以被排除了。
5、tomcat问题:由于之前调整过acceptcount到10000(当连接数20000左右的时候,会导致队列中的请求等待的时间很长),第一反应是:这个时间段,肯定有一些请求导致tomcat的请求队列满了,导致请求在排队,从而时间比较长。其它请求由于队列已经满了于是被丢弃,tomcat则不会接受TCP连接,从而导致入口流量降低。于是,在tomcat的log中增加了请求时间%T,希望在出问题的时间段找出有请求时间很长的请求。
6、等待了一天。
7、观察昨天的数据:发现在相同的时间段,出现了很多简单的请求却需要花大概将近2分钟,而且很多花了将近1分钟,
分析的命令: sort -k11rg file.txt:简单解释:按照空格分割,分割后按照第11列的数据排序,-r是倒叙排序,-g是将字符串转成数值再排序
8、找到对应的请求地址,以及客户端,找到客户端对应的负责人,和其沟通发现:会在每天凌晨大批量调用这个接口导致。
四、http 502 和 504 的区别
(1)502是网关错误,504是网关超时
(2)二者很类似
- 502是代理服务器后面的真实服务器节点配置出了问题或者已经挂掉了
- 而504是代理服务器后面的真实服务器已经过载,它要处理的请求报文实在太多,忙不过来了。
(3)502还有一种情况就是nginx与fastcgi即PHP进程配合的不恰当,导致返回502网关错误。
502–Bad Gateway
当服务器充当网关或代理并收到来自另一台服务器的无效响应时,在数据收集过程中会经常发生此错误;当代理拒绝Internet连接或发送的请求时,会检测到IP对所选设置不可用,因为机器人指示502代码。
504–Gateway Timeout
当服务器(a)充当外部网关或代理并且没有及时收到来自下一个服务器(b)的响应时,会收到“504–网关超时”,在尝试访问以实现请求。