Linux系統(tǒng)應(yīng)對(duì)短連接提高負(fù)載能力的解決方法
計(jì)算機(jī)用戶舍棄微軟,開(kāi)始應(yīng)用于是很多人開(kāi)始應(yīng)用Linux操作系統(tǒng),學(xué)習(xí)Linux時(shí),學(xué)習(xí)Linux,你可能會(huì)遇到Linux系統(tǒng)應(yīng)對(duì)短連接的負(fù)載能力問(wèn)題,這里將介紹Linux系統(tǒng)應(yīng)對(duì)短連接的負(fù)載能力的解決方法,在這里拿出來(lái)和大家分享一下。在存在大量短連接的情況下,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ì)超過(guò)三四萬(wàn)。這個(gè)時(shí)候,我們需要修改 Linux kernel 的 tcp time wait的時(shí)間,縮短之,有個(gè) sysctl 參數(shù)貌似可以使用,它是 /proc/sys/net/ipv4/tcp_fin_timeout,缺省值是 60,也就是60秒,很多網(wǎng)上的資料都說(shuō)將這個(gè)數(shù)值設(shè)置低一些就可以減少netstat 里面的TIME_WAIT狀態(tài),但是這個(gè)說(shuō)法是錯(cuò)誤的。經(jīng)過(guò)認(rèn)真閱讀Linux的內(nèi)核源代碼,我們發(fā)現(xiàn)這個(gè)數(shù)值其實(shí)是輸出用的,修改之后并沒(méi)有真正的讀回內(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ù)我們的測(cè)試,設(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ì)短連接的速度。以上就是如何進(jìn)行Linux系統(tǒng)應(yīng)對(duì)短連接的負(fù)載能力介紹。
【編輯推薦】