問題背景: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的關係
參考文檔: