问题背景:UI页面点击会偶尔返回error,检查调用日志,发现nginx报502报错,所以本文即排查502报错缘由。html
以下红框可知,访问本机个备机的服务502了,用时3秒左右(可见并非超时)nginx
先给出缘由:是由于tomcat8默认的acceptCount是100,请求量大的时候,会将一些来不及处理的请求塞到acceptCount,当acceptCount塞满的时候,请求会被丢弃,即咱们上面说的nginx报的502错误apache
解决方案:将acceptCount调大,目前线上调整到了10000,经16小时的观察,没有再报502错误,问题得以解决segmentfault
排查过程:tomcat
怀疑一:首先发现DB的压力突增,见图,可是DBA帮排查后,这个时间点并无慢查询,所以怀疑是不是服务器的问题服务器
怀疑二:是否是有一台服务有问题日志
可是经排查nginx日志,两台服务都有502出现。所以这个状况排除htm
怀疑三:tomcat的自己的问题。blog
因为nginx现实502的时候,时间有的只有3秒或者更小,所以也不是访问tomcat超时的,因此最大的可能就是tomcat丢弃了请求,经确认确实是丢弃了。队列
怎么证实这个推断呢?
首先:看请求是否进入tomcat了,好在咱们配置了tomcat的访问日志记录:配置以下:
日志:检查502请求的时间,在tomcat里面没有记录日志,可见并无进入tomcat,从而论证了上面的观点:502是由于请求被丢弃了。
那么为何会丢弃呢?
看了一些tomcat的默认配置,几个重要的配置:参考:https://tomcat.apache.org/tomcat-8.5-doc/config/http.html
可见很重要的一个:acceptCount是100,第一感官,过小了,超过这个队列就被丢弃了。
acceptCount解释:当maxConnections超过10000万(tomcat默认值是10000)的时候,会将多余的链接放到acceptCount中,即默认的tomcat能够支持的最大链接数是10000 + 100 = 10100;
当超过10100的时候,请求就会被丢弃,即nginx的502日志,解决方法:将acceptCount调整成10000。502问题得以解决。
注:
maxConnections与acceptCount的关系
参考文档: