總結:Tomcat調優之acceptCount

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

 

參考文檔:

https://tomcat.apache.org/tomcat-8.5-doc/config/http.html

http://www.javashuo.com/article/p-xnlqtnnt-kz.html

相關文章
相關標籤/搜索