1. 程式人生 > >net.ipv4.tcp_tw_recycle導致的請求超時

net.ipv4.tcp_tw_recycle導致的請求超時

背景:線上環境登入頁,大量請求超時無響應。檢查網正常,伺服器CPU,記憶體等引數也都正常。

參考:https://www.jianshu.com/p/893b5d7e9f30

原因:伺服器啟用了net.ipv4.tcp_tw_recycle機制

當開啟了tcp_tw_recycle選項後,當連線進入TIME_WAIT狀態後,會記錄對應遠端主機最後到達分節的時間戳。如果同樣的主機有新的分節到達,且時間戳小於之前記錄的時間戳,即視為無效,相應的資料包會被丟棄;

一個公網IP(經過NAT)大量地去反問伺服器,不同客戶端的時間可能不一致,所以就會出現時間戳錯亂的現象,於是後面的資料包就被丟棄了,具體的表現通常是是客戶端明明發送的SYN,但服務端就是不響應ACK,還可以通過下面命令來確認資料包不斷被丟棄的現象;

  • 檢視主機TCP連線數
  • netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

解決:

net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 0