優(yōu)化Linux下的內(nèi)核TCP參數(shù)以提高系統(tǒng)性能
內(nèi)核的優(yōu)化跟服務(wù)器的優(yōu)化一樣,應(yīng)本著穩(wěn)定安全的原則。下面以64位的Centos5.5下的Squid服務(wù)器為例來(lái)說(shuō)明,待客戶端與服務(wù)器端建立TCP/IP連接后就會(huì)關(guān)閉SOCKET,服務(wù)器端連接的端口狀態(tài)也就變?yōu)門IME_WAIT了。那是不是所有執(zhí)行主動(dòng)關(guān)閉的SOCKET都會(huì)進(jìn)入TIME_WAIT狀態(tài)呢?有沒有什么情況使主動(dòng)關(guān)閉的SOCKET直接進(jìn)入CLOSED狀態(tài)呢?答案是主動(dòng)關(guān)閉的一方在發(fā)送最后一個(gè)ACK后就會(huì)進(jìn)入TIME_WAIT狀態(tài),并停留2MSL(Max Segment LifeTime)時(shí)間,這個(gè)是TCP/IP必不可少的,也就是“解決”不了的。
TCP/IP的設(shè)計(jì)者如此設(shè)計(jì),主要原因有兩個(gè):
防止上一次連接中的包迷路后重新出現(xiàn),影響新的連接(經(jīng)過(guò)2MSL時(shí)間后,上一次連接中所有重復(fù)的包都會(huì)消失)。
為了可靠地關(guān)閉TCP連接。主動(dòng)關(guān)閉方發(fā)送的最后一個(gè)ACK(FIN)有可能會(huì)丟失,如果丟失,被動(dòng)方會(huì)重新發(fā)FIN,這時(shí)如果主動(dòng)方處于CLOSED狀態(tài),就會(huì)響應(yīng)RST而不是ACK。所以主動(dòng)方要處于TIME_WAIT狀態(tài),而不能是CLOSED狀態(tài)。另外,TIME_WAIT并不會(huì)占用很大的資源,除非受到攻擊。
在Squid服務(wù)器中可輸入查看當(dāng)前連接統(tǒng)計(jì)數(shù)的命令,如下所示:
CLOSED:無(wú)連接是活動(dòng)的或正在進(jìn)行中的。
LISTEN:服務(wù)器在等待進(jìn)入呼叫。
SYN_RECV:一個(gè)連接請(qǐng)求已經(jīng)到達(dá),等待確認(rèn)。
SYN_SENT:應(yīng)用已經(jīng)開始,打開一個(gè)連接。
ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)。
FIN_WAIT1:應(yīng)用說(shuō)它已經(jīng)完成。
FIN_WAIT2:另一邊已同意釋放。
CLOSING:兩邊同時(shí)嘗試關(guān)閉。
TIME_WAIT:另一邊已初始化一個(gè)釋放。
LAST_ACK:等待所有分組死掉。
也就是說(shuō),這條命令可以把當(dāng)前系統(tǒng)的網(wǎng)絡(luò)連接狀態(tài)分類匯總。
在Linux下高并發(fā)的Squid服務(wù)器中,TCP TIME_WAIT套接字?jǐn)?shù)量經(jīng)常可達(dá)兩三萬(wàn),服務(wù)器很容易就會(huì)被拖死。不過(guò),我們可以通過(guò)修改Linux內(nèi)核參數(shù)來(lái)減少Squid服務(wù)器的TIME_WAIT套接字?jǐn)?shù)量,命令如下所示:
vim /etc/sysctl.conf |
然后,增加以下參數(shù):
其中:
net.ipv4.tcp_syncookies=1表示開啟SYN Cookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookie來(lái)處理,可防范少量的SYN攻擊。默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_tw_reuse=1表示開啟重用。允許將TIME-WAIT套接字重新用于新的TCP連接。默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_tw_recycle=1表示開啟TCP連接中TIME-WAIT套接字的快速回收。默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_fin_timeout=30表示如果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時(shí)間。
net.ipv4.tcp_keepalive_time=1200表示當(dāng)keepalive啟用時(shí),TCP發(fā)送keepalive消息的頻度。默認(rèn)是2小時(shí),這里改為20分鐘。
net.ipv4.ip_local_port_range=1024 65000表示向外連接的端口范圍。默認(rèn)值很小:32768~61000,改為1024~65000。
net.ipv4.tcp_max_syn_backlog=8192表示SYN隊(duì)列的長(zhǎng)度,默認(rèn)為1024,加大隊(duì)列長(zhǎng)度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。
net.ipv4.tcp_max_tw_buckets=5000表示系統(tǒng)同時(shí)保持TIME_WAIT套接字的最大數(shù)量,如果超過(guò)這個(gè)數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認(rèn)為180000,改為5000。對(duì)于Apache、Nginx等服務(wù)器,前面介紹的幾個(gè)參數(shù)已經(jīng)可以很好地減少TIME_WAIT套接字?jǐn)?shù)量,但是對(duì)于Squid來(lái)說(shuō),效果卻不大。有了此參數(shù)就可以控制TIME_WAIT套接字的最大數(shù)量,避免Squid服務(wù)器被大量的TIME_WAIT套接字拖死。
執(zhí)行以下命令使內(nèi)核配置立即生效:
/sbin/sysctl -p |
如果是用于Apache或Nginx等的Web服務(wù)器,或Nginx的反向代理,則只需要更改以下幾項(xiàng)即可:
執(zhí)行以下命令使內(nèi)核配置立即生效: /sbin/sysctl -p如果是郵件服務(wù)器,則建議內(nèi)核方案如下:
執(zhí)行以下命令使內(nèi)核配置立即生效: /sbin/sysctl -p當(dāng)然這些都只是最基本的更改,大家還可以根據(jù)自己的需求來(lái)更改內(nèi)核的設(shè)置,同樣也要本著穩(wěn)定的原則,如果服務(wù)器不穩(wěn)定的話,一切工作和努力都會(huì)白費(fèi)。如果以上優(yōu)化仍無(wú)法滿足你的要求,有可能你需要定制你的服務(wù)器內(nèi)核或升級(jí)服務(wù)器硬件。至于服務(wù)的配置優(yōu)化,超出了本章的內(nèi)容,大家可根據(jù)自己的需求有針對(duì)性地進(jìn)行更改。
posted on 2011-12-08 14:30 順其自然EVO 閱讀(1146) 評(píng)論(0) 編輯 收藏