linux 系統優化tcp連線

2021-07-05 03:03:02 字數 2869 閱讀 6797

分享到:

出處:最近幾天 系統不太穩定, tcp/ip 連線超級多,估計應用伺服器到極限了 

網上看到了一片好文,隨抄在這裡了,感謝原作者 

原文連線:  

提高伺服器的負載能力,是乙個永恆的話題。在一台伺服器cpu和記憶體資源額定有限的情況下,最大的壓榨伺服器的效能,是最終的目的。要提高linux系統下的負載能力,可以先啟用apache的worker模式(參考我寫的《 ubuntu下配置apache的worker模式》一文),來提高單位時間內的併發量。但是即使這麼做了,當**發展起來之後,連線數過多的問題就會日益明顯。在節省成本的情況下,可以考慮修改linux的核心tcp/ip引數,來最大的壓榨伺服器的效能。當然,如果通過修改核心引數也無法解決的負載問題,也只能考慮公升級伺服器了,這是硬體所限,沒有辦法的事。

linux系統下,tcp/ip連線斷開後,會以time_wait狀態保留一定的時間,然後才會釋放埠。當併發請求過多的時候,就會產生大量的time_wait狀態的連線,無法及時斷開的話,會占用大量的埠資源和伺服器資源(因為關閉後程序才會退出)。這個時候我們可以考慮優化tcp/ip的核心引數,來及時將time_wait狀態的埠清理掉。

本文介紹的方法只對擁有大量time_wait狀態的連線導致系統資源消耗有效,不是這個原因的情況下,效果可能不明顯。那麼,到哪兒去查time_wait狀態的連線呢?那就是使用netstat命令。我們可以輸入乙個複核命令,去檢視當前tcp/ip連線的狀態和對應的個數:

#netstat -n | awk 『/^tcp/ end 』

這個命令會顯示出類似下面的結果:

last_ack 14 

syn_recv 348 

established 70 

fin_wait1 229 

fin_wait2 30 

closing 33 

time_wait 18122

我們只用關心time_wait的個數,在這裡可以看到,有18000多個time_wait,這樣就占用了18000多個埠。要知道埠的數量只有65535個,占用乙個少乙個,會嚴重的影響到後繼的新連線。這種情況下,我們就有必要調整下linux的tcp/ip核心引數,讓系統更快的釋放time_wait連線。

我們用vim開啟配置檔案:

#vim /etc/sysctl.conf

然後,在這個檔案中,加入下面的幾行內容:

net.ipv4.tcp_syncookies = 1 

net.ipv4.tcp_tw_reuse = 1 

net.ipv4.tcp_tw_recycle = 1 

net.ipv4.tcp_fin_timeout = 30

最後輸入下面的命令,讓核心引數生效:

#/sbin/sysctl -p

簡單的說明下,上面的引數的含義:

net.ipv4.tcp_syncookies = 1 表示開啟syn cookies。當出現syn等待佇列溢位時,啟用cookies來處理,可防範少量syn攻擊,預設為0,表示關閉; 

net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將time-wait sockets重新用於新的tcp連線,預設為0,表示關閉; 

net.ipv4.tcp_tw_recycle = 1 表示開啟tcp連線中time-wait sockets的快速**,預設為0,表示關閉; 

net.ipv4.tcp_fin_timeout 修改系統預設的 timeout 時間。

在經過這樣的調整之後,除了會進一步提公升伺服器的負載能力之外,還能夠防禦一定程度的ddos、cc和syn攻擊,是個一舉兩得的做法。

此外,如果你的連線數本身就很多,我們可以再優化一下tcp/ip的可使用埠範圍,進一步提公升伺服器的併發能力。依然是往上面的引數檔案中,加入下面這些配置:

net.ipv4.tcp_keepalive_time = 1200 

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_keepalive_time = 1200 表示當keepalive起用的時候,tcp傳送keepalive訊息的頻度。預設是2小時,改為20分鐘。 

net.ipv4.ip_local_port_range = 10000 65000 表示用於向外連線的埠範圍。預設情況下很小:32768到61000,改為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拖死。

經過這樣的配置之後,你的伺服器的tcp/ip併發能力又會上乙個新台階。

linux 系統優化tcp連線

提高伺服器的負載能力,是乙個永恆的話題。在一台伺服器cpu和記憶體資源額定有限的情況下,最大的壓榨伺服器的效能,是最終的目的。要提高linux系統下的負載能力,可以先啟用apache的worker模式 參考我寫的 ubuntu下配置apache的worker模式 一文 來提高單位時間內的併發量。但是...

tcp 短連線 優化

背景 在做dispatchsvr傳送http請求到業務server的時候,client端設定了1s的timeout,結果當網路出現問題的時候,client出現了大量timeout,並且關閉連線,這時候發現client的cpu和記憶體有大量增長。原理tcp 結束的過程如下 server client ...

TCP連線和電話系統

建立tcp連線就好比乙個 系統 nemeth 1997 socket函式等同於有 可用。bind函式是在告訴別人你的 號碼,這樣他們可以呼叫你。listen函式是開啟 振鈴,這樣當有乙個外來呼叫到達時,你就可以聽到。connect函式要求我們知道對方的 號碼並撥打它。accept函式發生在被呼叫的人...