天天看點

調優 tcp http

tcp

1.tcp_keepalive_time

int keepAlive = 1;   // 開啟keepalive屬性. 預設值: 0(關閉)  

int keepIdle = 60;   // 如果在60秒内沒有任何資料互動,則進行探測. 預設值:7200(s)  

int keepInterval = 5;   // 探測時發探測包的時間間隔為5秒. 預設值:75(s)  

int keepCount = 2;   // 探測重試的次數. 全部逾時則認定連接配接失效..預設值:9(次)  

setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));  

setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));  

setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));  

setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount)); 

mongodb echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time 預設是7200

1.tcp_keepalive_time and rst Flag in NAT Environment

2.再次了解tcp關閉連接配接出現time_wait的情況

2MSL一般是大于30s,小于4分鐘. 最小也要30s,再大就沒啥意義了

reset封包發送場景:

RST的标志位,這個辨別為在如下幾種情況下會被設定,以下是我了解的情況,可能還有更多的場景,沒有驗證

當嘗試和未開放的伺服器端口建立tcp連接配接時,伺服器tcp将會直接向用戶端發送reset封包

雙方之前已經正常建立了通信通道,也可能進行過了互動,當某一方在互動的過程中發生了異常,如崩潰等,異常的一方會向對端發送reset封包,通知對方将連接配接關閉

當收到TCP封包,但是發現該封包不是已建立的TCP連接配接清單可處理的,則其直接向對端發送reset封包

ack封包丢失,并且超出一定的重傳次數或時間後,會主動向對端發送reset封包釋放該TCP連接配接

另外我們做大量api請求時會遇到下面的問題. Broken pipe和Connection reset by peer  .   這其實也是reset的報錯一種.

本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1854649,如需轉載請自行聯系原作者

繼續閱讀