2020年3月5号14時40分,技術支援回報有使用者來電詢問單據無法列印,開發人員經過日志排查,發現是連接配接阿裡雲OSS逾時,經過日志分析,從3月4号16時10分開始陸陸續續出現單據列印失敗,因為昨天前天均未發版,上次發版還是2月28号,是以不太可能是近期發版導緻的問題。
連接配接逾時,首先想到的是聯系運維架構組是否有何種外網通路限制或者OSS固有問題,但是均無答案。包括開通外網通路限制均未能解決問題。
接着,開發人員說去年也遇到過類似的問題,是連接配接池占滿了,重新開機之後解決,但是後續壓測均未能定位到原因。是以我們也緊急重新開機了一台機器,另一台dump之後也重新開機了,果然問題解決,單據正常列印。
接着檢視句柄資訊,發現有大量的TIME_WAIT狀态的TCP連接配接,共計256條,是以考慮是連接配接未正常釋放,翻看代碼,果然,确實是一行重複請求OSS的代碼,初步斷定是該原因導緻。

晚上通過壓測,發現伴随着每一次列印請求都會出現一條TIME_WAIT狀态的TCP連接配接,循環請求200多次之後,果然出現了連接配接逾時的錯誤日志。删除重複代碼,重新啟動程式,保持跟之前相同的重複請求,300次之後,程式正常,無連接配接逾時的錯誤日志,通過
lsof -p pid
檢視句柄,也未發現處于TIME_WAIT狀态的TCP連接配接,OK原因定位。
修改代碼,申請發版,觀察線上也未出現異常狀态的TCP連接配接。
再來回看原因,OSS伺服器資料發送完成之後向應用伺服器(OSS JDK)發送了SEQ+FIN封包請求終止連接配接(此時OSS伺服器狀态FIN_WAIT_1),應用伺服器很快回複了ACK(應用伺服器CLOSE_WAIT,OSS FIN_WAIT_2),但是因為應用服務端代碼沒有正常關閉連接配接,導緻無法發送SEQ+FIN封包給OSS伺服器,應用伺服器使用的OSS JDK連接配接池大小是256,256次請求之後,連接配接池占滿,後續請求無法擷取到連接配接,10秒逾時。