与TIME_WAIT相关的几个内核参数
問題
公司用瀏覽器訪問線上服務(wù)一會(huì)失敗一會(huì)成功,通過ssh連接服務(wù)器排查時(shí)發(fā)現(xiàn)ssh也是這樣;
檢查
抓包后發(fā)現(xiàn)建立連接的請(qǐng)求已經(jīng)到了服務(wù)器,但它沒有響應(yīng);
糾結(jié)了好久,后來在騰訊云技術(shù)支持及查了相關(guān)資料后發(fā)現(xiàn)是開啟了net.ipv4.tcp_tw_recycle導(dǎo)致的,將其設(shè)為0即可解決;
原因
收集了幾個(gè)與TIME_WAIT相關(guān)的內(nèi)核參數(shù):
net.ipv4.tcp_timestamps 默認(rèn)開啟(1),數(shù)據(jù)包加時(shí)間戳,需要兩端都開啟,可以防止高速率寬帶時(shí)引起的序號(hào)回繞(序號(hào)不夠用重新開始了),可以精確計(jì)算出RTT(往返時(shí)延) net.ipv4.tcp_tw_reuse 默認(rèn)關(guān)閉(0),允許TIME_WAIT的socket在超過1秒后重用,作用于發(fā)起連接的client端 net.ipv4.tcp_tw_recycle 默認(rèn)關(guān)閉(0),允許快速回收處于TIME_WAIT的socket,作用于接受連接的server端 net.ipv4.ip_local_port_range 默認(rèn)(32768 61000),可用的端口范圍 net.ipv4.tcp_max_tw_buckets 默認(rèn)(180000),允許處于TIME_WAIT狀態(tài)socket的最大數(shù)量若TIME_WAIT過多,可以開啟reuse和recycle來快速回收,值得注意的一點(diǎn)是,reuse和recycle需要timestamps開啟才會(huì)生效,當(dāng)然timestamps一般都是開啟的;
上面問題的原因是,當(dāng)多個(gè)client通過nat方式聯(lián)網(wǎng)時(shí)(一個(gè)局域網(wǎng))它們的源ip相同但發(fā)出的時(shí)間戳很可能是亂的,而開啟了recycle的server端就會(huì)丟棄這些混亂的數(shù)據(jù)包,于是現(xiàn)象就是有時(shí)能連上有時(shí)不行;
至于reuse,開啟可能導(dǎo)致端口重用后還會(huì)收到上個(gè)socket延遲到達(dá)的數(shù)據(jù),這個(gè)一般問題不大,應(yīng)用程序都會(huì)校驗(yàn);
雖然reuse在client端配置有效,而recycle在server端,但現(xiàn)在很多機(jī)器都是接受連接后再去連接別人,所以視情況而定吧。
總結(jié)
官方文檔是不建議開啟reuse和recycle的,因?yàn)檫`反了tcp協(xié)議,所以臨時(shí)開啟來解決異常情況后應(yīng)及時(shí)關(guān)閉;
若TIME_WAIT過多導(dǎo)致系統(tǒng)很慢(Linux對(duì)其優(yōu)化很好,且現(xiàn)在不缺這點(diǎn)內(nèi)存,所以一般不會(huì)),可以降低tcp_max_tw_buckets,阿里云和騰訊云分別默認(rèn)設(shè)置為了5000、65536;
若端口不足可以考慮加大 ip_local_port_range,最大不超過:1024? 65535;
TIME_WAIT過多長(zhǎng)遠(yuǎn)的解決方式還是通過程序開發(fā)方面:
1. 代碼中及時(shí)正確的調(diào)用socket的close;
2. 讓client端主動(dòng)斷開連接,而不是server端;
3. 盡量使用長(zhǎng)連接,而不是短連接;
?
over
轉(zhuǎn)載于:https://www.cnblogs.com/toSeek/p/8961981.html
總結(jié)
以上是生活随笔為你收集整理的与TIME_WAIT相关的几个内核参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浦发银行咪蒙信用卡审批要多久?网申有机会
- 下一篇: AIX主机信任关系配置