最近有一次效能測試,通訊程式出現錯誤,表現為伺服器處理速度明顯降低,檢查發現伺服器的很多控制代碼出於
time_wait
狀態,justin
這個流氓的自己承認測試用例寫的有問題,在
recv
函式返回
0 後,沒有
close
控制代碼。我很鬱悶
了一下如何處理這類錯誤,發現了
so_linger
這個選項,發現這個選項可以避免埠的狀態進入
time_wait
狀態,大膽的進行了一下測試。發現在效能測試中,伺服器的表現好了不少,暗爽。 //
使用so_linger
,close
後不進入
time_wait
狀態 struct linger linger;
linger.l_onoff = 1;
linger.l_linger = 0;
setsockopt(serversocket,
sol_socket, so_linger,
(const char *) &linger,
sizeof(linger));
周3發版本,突然發現很多同事的都報告出現了一些錯誤,從客戶端的日誌反饋看,客戶端在最後階段往往沒有收到幾個我們的伺服器的返回命令,於是立即想到了可能是這個選項導致了麻煩。注釋這個選項後,果然大家的程式都正常了。
回頭仔細讀了一下《
unix
網路程式設計》卷
1 ,才慢慢回想起來,
time_wait
的作用是保證在主動關閉埠後,保證資料讓對端收到,
richard.steven
的原話是
」time_wait
是我們的朋友。」
由於我們客戶端要和多個遊戲伺服器通訊,而且之間還有一些時序關係,所以我們不能使用這種讓使用者丟棄一部分資料的方式。對於
tcp 的細節感覺還是不熟悉,呵呵。
不能丟棄
time_wait
狀態,但是讓他縮短一些也是可以的。我們可以在
l_linger
引數上動點手腳,當
l_onoff 非0
是。l_linge
也非0的時候,套介面在
time_wait
上將拖延一段時間,
l_linger
秒,而不再是
2msl
的超時[ 注
] 。我也打算繼續試驗一下。
【注】,根據《
unix
網路程式設計》卷
1 ,需要注意的是,
l_linger 非0
的解釋在不同的平台可能不一樣,
bsd 平台的實現是
0.01s 。
慎用TCP的選項SO LINGER
最近有一次效能測試,通訊程式出現錯誤,表現為伺服器處理速度明顯降低,檢查發現伺服器的很多控制代碼出於time wait狀態,justin這個流氓的自己承認測試用例寫的有問題,在recv函式返回0後,沒有close控制代碼。我很鬱悶google了一下如何處理這類錯誤,發現了so linger這個選項,...
TCP頭部選項
tcp頭部的最後乙個選項字段 options 是可變長的可選資訊。這部分最多包含40位元組,因為tcp頭部最長是60位元組 其中還包含前面討論的20位元組的固定部分 典型的tcp頭部選項結構如圖3 4所示。選項的第乙個欄位kind說明選項的型別。有的tcp選項沒有後面兩個字段,僅包含1位元組的kin...
優雅關閉socket的方法 SO LINGER
這個引數對應大量短鏈結的伺服器很有必要!shutdown fd,shut rdwr struct linger linger linger.l onoff 1 linger.l linger 0 setsockopt fd,sol socket,so linger,char linger,sizeo...