優化Linux下的內核TCP參數以提高系統性能

內核的優化跟服務器的優化一樣,本着穩定安全的原則。下面以64位的CentOS 5.5下的
Squid服務器爲例來說明,待客戶端與服務器端建立TCP/IP連接後就會關閉SOCKET,服務器
端連接的端口狀態也就變爲TIME_WAIT了。那是不是所有執行主動關閉的SOCKET都會進入
TIME_WAIT狀態呢?有沒有什麼情況使主動關閉的SOCKET直接進入CLOSED狀態呢?答案
是主動關閉的一方在發送最後一個ACK後就會進入TIME_WAIT狀態,並停留2MSL(Max
Segment LifeTime)時間,這個是TCP/IP必不可少的,也就是“解決”不了的。
TCP/IP設計者如此設計,主要原因有兩個:
·防止上一次連接中的包迷路後重新出現,影響新的連接(經過2MSL時間後,上一次連
接中所有重複的包都會消失)。
·爲了可靠地關閉TCP連接。主動關閉方發送的最後一個ACK(FIN)有可能會丟失,如
果丟失,被動方會重新發FIN,這時如果主動方處於CLOSED狀態,就會響應RST而不是
ACK。所以主動方要處於TIME_WAIT狀態,而不能是CLOSED狀態。另外,TIME_WAIT並不
會佔用很大的資源,除非受到***。
在Squid服務器中可輸入查看當前連接統計數的命令,如下所示:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'


命令顯示結果如下所示:
LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122
命令中的含義分別如下所示:
·CLOSED:無連接是活動的或正在進行中。
·LISTEN:服務器在等待進入呼叫。
·SYN_RECV:一個連接請求已經到達,等待確認。
·SYN_SENT:應用已經開始,打開一個連接。
·ESTABLISHED:正常數據傳輸狀態。
·FIN_WAIT1:應用說它已經完成。
·FIN_WAIT2:另一邊已同意釋放。
·ITMED_WAIT:等待所有分組死掉。
·CLOSING:兩邊同時嘗試關閉。
·TIME_WAIT:另一邊已初始化一個釋放。
·LAST_ACK:等待所有分組死掉。


也就是說,這個命令可以把當前系統的網絡連接狀態分類彙總。
在Linux下高併發的Squid服務器中,TCP TIME_WAIT套接字數量經常可達兩三萬,服務
器很容易就會被拖死。不過,我們可以通過修改Linux內核參數來減少Squid服務器的
TIME_WAIT套接字數量,命令如下所示:


vim /etc/sysctl.conf
然後,增加以下參數:
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
其中:
·net.ipv4.tcp_syncookies=1表示開啓SYN cookies。當出現SYN等待隊列溢出時,啓用
cookie來處理,可防範少量的SYN***,默認爲0,表示關閉。


·net.ipv4.tcp_tw_reuse=1表示開啓重用。允許將TIME_WAIT socket重新用於新的TCP
連接,默認爲0,表示關閉。


·net.ipv4.tcp_tw_recycle=1表示開啓TCP連接中TIME_WAIT socket的快速回收,默認
爲0,表示關閉。


·net.ipv4.tcp_fin_timeout=30表示如果套接字由本端要求關閉,這個參數決定了它保持
在FIN-WAIT-2狀態的時間。
·net.ipv4.tcp_keepalive_time=1200表示當Keepalived啓用時,TCP發送Keepalived消
息的頻度。默認是2小時,改爲20分鐘。


·net.ipv4.ip_local_port_range=1024 65000表示向外連接的端口範圍。默認值很小:
32768~61000,改爲1024~65000。


·net.ipv4.tcp_max_syn_backlog=8192表示SYN隊列的長度,默認爲1024,加大隊列長
度爲8192,可以容納更多等待連接的網絡連接數。


·net.ipv4.tcp_max_tw_buckets=5000表示系統同時保持TIME_WAIT套接字的最大數
量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並輸出警告信息。默認爲
180000,改爲5000。對於Apache、Nginx等服務器,前面介紹的幾個參數已經可以很好地
減少TIME_WAIT套接字數量,但是對於Squid來說,效果卻不大。有了此參數就可以控制
TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。
執行以下命令使內核配置立馬生效:
/sbin/sysctl –p


如果使用Apache或Nginx等Web服務器,則只需要更改以下幾項即可:
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000


執行以下命令使內核配置立馬生效:


/sbin/sysctl –p


如果使用Postfix郵件服務器,則建議內核方案如下:


net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
kernel.shmmax = 134217728


執行以下命令使內核配置立馬生效:
/sbin/sysctl –p


當然這些都只是最基本的更改,大家還可以根據自己的需求來更改內核的設置,同樣也
要本着服務器穩定爲最高原則,如果服務器不穩定,一切工作和努力都會白費。如果以上優
化仍無法滿足你的要求,你有可能需要定製你的服務器內核或升級服務器硬件。至於服務的
配置優化,超出了本章的內容,大家可根據自己的需求有針對性地更改。
在本節中,我們從服務器的硬件選擇、安裝及內核等方面對單機服務器的性能進行了優
化,不過對於網站和系統來說,單機優化對整體性能提升的作用畢竟有限,它們的優化其實
是靠服務器的高可用和高擴展性來實現的,這部分內容我在後面的章節中再來說明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章