優化Linux下的核心TCP引數以提高系統效能

2021-09-08 09:37:02 字數 1497 閱讀 1137

2011-12-08 10:03   

核心的優化跟伺服器的優化一樣,應本著穩定安全的原則。下面以64位的centos5.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/ end '  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

然後,增加以下引數:

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

優化Linux下的核心TCP引數以提高系統效能

那是不是所有執行主動關閉的socket都會進入time wait狀態呢?有沒有什麼情況使主動關閉的socket直接進入closed狀態呢?答案是主動關閉的一方在傳送最後乙個ack後就會進入time wait狀態,並停留2msl max segment lifetime 時間,這個是tcp ip必不可...

優化Linux下的核心TCP引數以提高系統效能

核心的優化跟伺服器的優化一樣,應本著穩定安全的原則。下面以64位的centos 5.5下的squid伺服器為例來說明,待客戶端與伺服器端建立tcp ip連線後就會關閉socket,伺服器端連線的埠狀態也就變為time wait了。那是不是所有執行主動關閉的socket都會進入time wait狀態呢...

優化Linux下的核心TCP引數以提高系統效能

優化linux下的核心tcp引數以提高系統效能 核心的優化跟伺服器的優化一樣,應本著穩定安全的原則。下面以squid伺服器為例來說明,待客戶端與伺服器端建立tcp ip連線後就會關閉socket,伺服器端連線的埠狀態也就變為time wait了。那是不是所有執行主動關閉的socket都會進入time...