一陡叠、問題描述
阿里云服務器偶爾連接不上的問題出現在我做了一些TCP優(yōu)化之后伸但,出現了公司內網偶爾會出現連接不上服務器的問題敬尺,但是切換其他的網絡就可以正常連接枚尼。
二、故障分析
1砂吞,登陸服務器查看資源使用top署恍,vmstat等命令查看了一番發(fā)現服務器各項指標都沒有異常。于是將問題轉向了網絡層蜻直。
2盯质,本地使用ping服務器外網ip正常返回,無丟包概而,延遲也正常呼巷。
3,登錄服務器查看tcp相關數據赎瑰。
$ netstat -s | grep -i listen
326 times the listen queue of a socket overflowed
751346 SYNs to LISTEN sockets dropped
發(fā)現在卡頓時有大量tcp syn包被丟棄王悍,數值一直在增長。
三餐曼、故障處理:
在查閱資料并結合實際情況后压储,發(fā)現該服務器同時啟用了 tcp_timestamps和tcp_tw_recycle參數鲜漩。
后想起,之前同事為改善time_wait連接數過多問題曾改過該內核參數集惋。
解決辦法是孕似,關閉tcp_tw_recycle:
$ vi /etc/sysctl.conf
#修改為如下
net.ipv4.tcp_tw_recycle = 0
#保存退出,使之生效
$ sysctl -p
再觀察刮刑,發(fā)現服務已正常喉祭,偶爾連接不上的現象消失。
四为朋、總結
我們先來man一下這兩個參數(man tcp):
tcp_timestamps (Boolean; default: enabled; since Linux 2.2)
Enable RFC 1323 TCP timestamps.
cp_timestamp 是 RFC1323 定義的優(yōu)化選項臂拓,主要用于 TCP 連接中 RTT(Round Trip Time) 的計算,開啟 tcp_timestamp 有利于系統(tǒng)計算更加準確的 RTT习寸,也就有利于 TCP 性能的提升胶惰。(默認開啟)
關于tcp_timestamps詳情請見:https://tools.ietf.org/pdf/rfc7323.pdf
tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
Enable fast recycling of TIME_WAIT sockets. Enabling this option is not recommended since this causes problems when working with NAT (Network Address
Translation).
開啟tcp_tw_recycle會啟用tcp time_wait的快速回收,這個參數不建議在NAT環(huán)境中啟用霞溪,它會引起相關問題孵滞。
tcp_tw_recycle是依賴tcp_timestamps參數的,在一般網絡環(huán)境中鸯匹,可能不會有問題坊饶,但是在NAT環(huán)境中,問題就來了殴蓬。比如我遇到的這個情況匿级,辦公室的外網地址只有一個,所有人訪問后臺都會通過路由器做SNAT將內網地址映射為公網IP染厅,由于服務端和客戶端都啟用了tcp_timestamps痘绎,因此TCP頭部中增加時間戳信息,而在服務器看來肖粮,同一客戶端的時間戳必然是線性增長的孤页,但是,由于我的客戶端網絡環(huán)境是NAT涩馆,因此每臺主機的時間戳都是有差異的行施,在啟用tcp_tw_recycle后,一旦有客戶端斷開連接魂那,服務器可能就會丟棄那些時間戳較小的客戶端的SYN包蛾号,這也就導致了網站訪問極不穩(wěn)定。
主機A SIP:P1 (時間戳T0) ---> Server 主機A斷開后
主機B SIP:P1 (時間戳T2) T2 < T0 ---> Server 丟棄
經過此次故障涯雅,告誡我們在處理線上問題時须教,不能盲目修改參數,一定要經過測試,確認無誤后轻腺,再應用于生產環(huán)境。同時划乖,也要加深對相關內核參數的認識和理解贬养。
本文解決靈感來自于https://blog.51cto.com/hld1992/2285410
https://blog.csdn.net/chengm8/article/details/51668992