- 論壇徽章:
- 0
|
在存在大量短連接的情況下,
Linux
的TCP棧一般都會(huì)生成大量的 TIME_WAIT 狀態(tài)的socket。
你可以用下面的命令看到:
netstat -ant| grep -i time_wait
有時(shí)候,這個(gè)數(shù)目是驚人的:
netstat -ant|grep -i time_wait |wc -l
可能會(huì)超過三四萬。這個(gè)時(shí)候,我們需要修改 linux kernel 的 tcp time wait的時(shí)間,縮短之,有個(gè) sysctl 參數(shù)貌似可以使用,它是 /proc/sys/net/ipv4/tcp_fin_timeout,缺省值是 60,也就是60秒,很多網(wǎng)上的資料都說將這個(gè)數(shù)值設(shè)置低一些就可以減少netstat 里面的TIME_WAIT狀態(tài),但是這個(gè)說法是錯(cuò)誤的。經(jīng)過認(rèn)真閱讀Linux的內(nèi)核源代碼,我們發(fā)現(xiàn)這個(gè)數(shù)值其實(shí)是輸出用的,修改之后并沒有真正的讀回內(nèi)核中進(jìn)行使用,而內(nèi)核中真正管用的是一個(gè)宏定義,在 $KERNEL/include/net/tcp.h里面,有下面的行:
#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
* state, about 60 seconds */
而這個(gè)宏是真正控制 TCP TIME_WAIT 狀態(tài)的超時(shí)時(shí)間的。如果我們希望減少 TIME_WAIT 狀態(tài)的數(shù)目(從而節(jié)省一點(diǎn)點(diǎn)內(nèi)核操作時(shí)間),那么可以把這個(gè)數(shù)值設(shè)置低一些,根據(jù)我們的測試,設(shè)置為 10 秒比較合適,也就是把上面的修改為:
#define TCP_TIMEWAIT_LEN (10*HZ) /* how long to wait to destroy TIME-WAIT
* state, about 60 seconds */
然后重新編譯內(nèi)核,重啟系統(tǒng)即可發(fā)現(xiàn)短連接造成的TIME_WAIT狀態(tài)大大減少:
netstat -ant | grep -i time_wait |wc -l
一般情況都可以至少減少2/3。也能相應(yīng)提高系統(tǒng)應(yīng)對(duì)短連接的速度
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u1/59571/showart_2077638.html |
|