【轉】https://segmentfault.com/q/1010000011412748
在tomcat的配置文件server.xml中,可以設置Connector的參數,其中包含超時參數connectionTimeout。
apache官網對於這些參數的解釋:https://tomcat.apache.org/tom...
本人對其中幾個重要參數大致理解為(應該理解錯了):
- connectionTimeout:一個請求最多等待時間,超過則報錯。
- maxConnections:最多同時連接數,連接上不一定處理。超過連接數,則排隊。
- maxThreads:同時處理的線程數,經測試,理解無誤。
- acceptCount:等待隊列長度,當超越maxConnections時,會進入等待隊列。等待隊列滿之后,直接拒絕請求。
對這些參數進行測試,然而遇到了疑惑。
第一組測試
設置:
connectionTimeout為10000,
maxConnections為2,
maxThreads為2,
acceptCount為2。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="10000" redirectPort="8443" maxConnections="2" maxThreads="2" acceptCount="2"/>
寫一個controller測試,sleep30s。
@RequestMapping(value = "sync") @ResponseBody public String sync() throws InterruptedException { Thread.sleep(30000L); return "test success"; }
使用JMeter進行測試。
測試結果,嘗試三次都一致,如下:
一共20次請求,失敗14個。
前兩個請求,的確是在30s之后返回。
失敗的14個請求,都在52s左右。
最后四個成功的請求,前兩個在60s時返回,后兩個在90s時返回。符合sleep30s的時間點。
分析:
- 同時生成20次請求。
- maxConnections=2,有兩個請求被連接上,acceptCount=2,有兩個請求進行排隊。
- 其余16個請求,應該在某處也“排着隊”吧,就稱為野生請求。
- maxThreads=2,兩個請求同時處理,30s后,這兩個請求處理完畢。
- 排隊的兩個請求連接,兩個野生請求進入隊列。
- 莫名其妙地在52s時,進行了一波等待超時判斷,14個野生請求全部失敗。
- 已經連接和在排隊中的請求后續會成功處理。
疑問:
- 52s來自何處,設置的connectionTimeout是10s呢。
第二組測試
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="10000" redirectPort="8443" maxConnections="10" maxThreads="2" acceptCount="5"/>
其中設置:
connectionTimeout為10000,
maxConnections為10,
maxThreads為2,
acceptCount為5。
仍發起20次請求,共失敗5次
失敗的4次請求,仍然是在52s左右失敗。
之后的請求返回時間符合每30s返回兩個的預期。
分析:
- 連接10個,等待5個,每次處理2個。
- 30s后,2個請求成功返回,連接數變成8個,按照第一組的分析,會有2個等待請求頂上去。那么,最終失敗的請求應該是3個,然而結果是5個。
- 猜測需要等到連接的請求全部完成后或完成一部分之后,等待請求才會頂上去,野生請求只能干等。
疑問:
- connectionTimeout參數作用是?52s何處來?
-
其他幾個參數理解是否正確?