:
當(dāng)客戶端因為某種原因先于服務(wù)端發(fā)出了FIN信號,就會導(dǎo)致服務(wù)端被動關(guān)閉,若服務(wù)端不主動關(guān)閉發(fā)FIN給,此時服務(wù)端會處于狀態(tài)(而不是狀態(tài))。通常來說,一個會維持至少2個小時的時間(系統(tǒng)默認超時時間的是7200秒,也就是2小時)。如果服務(wù)端程序因某個原因?qū)е孪到y(tǒng)造成一堆消耗資源,那么通常是等不到釋放那一刻,系統(tǒng)就已崩潰。因此,解決這個問題的方法還可以通過修改TCP/IP的參數(shù)來縮短這個時間,于是修改*系列參數(shù):
:
/proc/sys/net/ipv4/
,默認值是7200(2小時)
當(dāng)打開的情況下,TCP發(fā)送消息的頻率。建議修改值為1800秒。
:
/proc/sys/net/ipv4/
,默認值是9
TCP發(fā)送探測以確定該連接已經(jīng)斷開的次數(shù)。(注意:保持連接僅在套接字選項被打開是才發(fā)送.次數(shù)默認不需要修改,當(dāng)然根據(jù)情形也可以適當(dāng)?shù)乜s短此值.設(shè)置為5比較合適)
:
/proc/sys/net/ipv4/
,默認值為75
當(dāng)探測沒有確認時,重新發(fā)送探測的頻度。探測消息發(fā)送的頻率(在認定連接失效之前,發(fā)送多少個TCP的探測包)。乘以就得到對于從開始探測以來沒有響應(yīng)的連接殺除的時間。默認值為75秒,也就是沒有活動的連接將在大約11分鐘以后將被丟棄。(對于普通應(yīng)用來說,這個值有一些偏大,可以根據(jù)需要改小.特別是web類服務(wù)器需要改小該值,15是個比較合適的值)
修改方法:
一、 命令修改:(暫時生效,重新啟動服務(wù)器后,會還原成默認值)
-w net.ipv4.=600
-w net.ipv4.=2
-w net.ipv4.=2
注意:Linux的內(nèi)核參數(shù)調(diào)整的是否合理要注意觀察,看業(yè)務(wù)高峰時候效果如何。
二、 若做如上修改后,可起作用;則做如下修改以便永久生效。
vi /etc/.conf
若配置文件中不存在如下信息,則添加:
net.ipv4. = 1800
net.ipv4. = 3
net.ipv4. = 15
編輯完 /etc/.conf,要重啟 才會生效
/etc/rc.d/init.d/
然后,執(zhí)行命令使修改生效,基本上就算完成了。
問題總結(jié):
上述操作完事后netstat端口號沒有進程netstat端口號沒有進程,常規(guī)的問題應(yīng)該就能解決了,但是在我的場景中未能解決,進程未能關(guān)閉,因為命令中第二列的REC-Q也就是接收隊列不為0,有積壓,導(dǎo)致未能被自動關(guān)閉,經(jīng)排查,發(fā)現(xiàn)該端口對應(yīng)的進程都成為了僵尸進程導(dǎo)致端口無法釋放。
僵尸進程又分為僵尸進程和孤兒進程,區(qū)別是通過ps命令查看僵尸進程的PPID是否為空,不為空是僵尸進程,為空是孤兒進程。如果是僵尸進程,處理方式參照我之前的博客;如果是孤兒進程,一般情況下操作系統(tǒng)在一定時間內(nèi)自己就回收了,稍等即可