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

2021-09-21 06:43:47 字數 3315 閱讀 4499

優化linux下的核心tcp引數以提高系統效能

核心的優化跟伺服器的優化一樣,應本著穩定安全的原則。下面以squid伺服器為例來說明,待客戶端與伺服器端建立tcp/ip連線後就會關閉socket,伺服器端連線的埠狀態也就變為time_wait了。那是不是所有執行主動關閉的socket都會進入time_wait狀態呢?有沒有什麼情況可使主動關閉的socket直接進入closed狀態呢?答案是主動關閉的一方在傳送最後乙個ack後就會進入time_wait狀態,並停留2msl(報文最大生存)時間,這是tcp/ip必不可少的,也就是說這一點是「解決」不了的。

tcp/ip設計者如此設計,主要原因有兩個:

a.防止上一次連線中的包迷路後重新出現,影響新的連線(經過2msl時間後,上一次連線中所有重複的包都會消失)。

b.為了可靠地關閉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:另一邊已同意釋放。

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 = 10000 65000

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.tcp_fin_timeout=30表示如果套接字由本端要求關閉,那麼這個引數將決定它保持在fin-wait-2狀態的時間。

net.ipv4.tcp_keepalive_time=1200表示當keepalived啟用時,tcp傳送keepalived訊息的頻度改為20分鐘,預設值是2小時。

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.ip_local_port_range=10000 65000表示centos系統向外連線的埠範圍。其預設值很小,這裡改為10000到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 = 10000 65000

#如果是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 = 10000 65000

kernel.shmmax = 134217728

當然這些都只是最基本的更改,大家還可以根據自己的需求來更改核心的設定,比如我們的線上機器在高併發的情況下,經常會出現「tcp:too many orpharned sockets」的報錯盡量也要本著伺服器穩定的最高原則。如果伺服器不穩定的話,一切工作和努力就都會白費。如果以上優化仍無法滿足工作要求,則有可能需要定製你的伺服器核心或公升級伺服器硬體。

優化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引數以提高系統效能

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