CentOS下核心TCP參數最佳化配置詳解

來源:互聯網
上載者:User

那是不是所有執行主動關閉的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:另一邊已同意釋放。
CLOSING:兩邊同時嘗試關閉。
TIME_WAIT:另一邊已初始化一個釋放。
LAST_ACK:等待所有分組死掉。

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

 代碼如下 複製代碼

#vim /etc/sysctl.conf

然後, 增加以下參數:

 代碼如下 複製代碼

#適用於Squid伺服器
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通訊端重新用於新的TCP串連。預設為0,表示關閉。
net.ipv4.tcp_tw_recycle=1表示開啟TCP串連中TIME-WAIT通訊端的快速回收。預設為0,表示關閉。
net.ipv4.tcp_fin_timeout=30表示如果通訊端由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_keepalive_time=1200表示當keepalive啟用時,TCP發送keepalive訊息的頻度。預設是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伺服器,或Nginx的反向 Proxy,則只需要更改以下幾項即可:

 代碼如下 複製代碼


#適用於Apache或Nginx等web伺服器,或Nginx的反向 Proxy
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_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

最後記得,執行sysctl -p命令市核心配置生效:

 代碼如下 複製代碼

#/sbin/sysctl -p

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.