TCP連線數過多問題

2021-09-07 15:14:50 字數 1336 閱讀 9919

在一次生產上線後,發現使用的 8086 埠相關的 tcp 連線數竟然多大 6k+ ,有時候甚至會逼近 1w ,這個數量對於乙個只是在內部使用的監控系統來說, 無論如何都是無法接受的, 於是開始一系列的排查過程. 本文記錄了這個問題的主要解決過程,算是對這一次殺 bug 過程的乙個總結.

使用命令

netstat -apn | grep 8086

可以看到大量處於 time_wait狀態的 tcp 連線

使用命令

netstat -apn | grep 8086 | grep time_wait | wc -l

進行計數, 會發現連線數會不斷增加, 經過多次測試, 在公司環境中連線數至少都會達到 6k+. 這個問題必須要解決, 一方面是因為每條 tcp 連線都會占用記憶體, 另一方面系統的動態埠數也是有限的.

很明顯這些連線幾乎都處在 time_wait 狀態,所以在繼續往下走之前, 需要了解下 time_wait 這個關鍵字

我們知道 一條 tcp 連線從開始到結束會經歷多個狀態, 換句話說, 可以把 一條 tcp 連線看成是乙個 狀態機. 這個狀態圖如下:

可以看到, 凡是主動進行關閉 tcp 連線的一方, 都會經過 time_wait 這個狀態.接下來再經過 2msl 的時間後核心再完全釋放相應的檔案描述符和埠. (順便提一下, msl 是最大分段壽命, 是乙個 tcp 分段可以存在於網際網路系統中的最大時間, 在 linux 下可以用命令檢視 msl的數值:

cat /proc/sys/net/ipv4/tcp_fin_timeout

到這個地方可以推斷出, 是 8086 埠主動關閉了 tcp 連線, 導致擠壓了大量的處於 time_wait 狀態下的連線在等待核心釋放

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 2000

利用root口令執行sysctl -p

Sybase資料庫連線數過多問題

我們的開發團隊增加到10多人後,由於共享乙個資料庫,導致先連線上的能連上,後連線上的就連線不上了,經過上網搜尋相關資料,由於 sybase 預設的連線數只有 20個,需要設定多一些連線數,在 sybase 資料庫設定中選擇 number of remote connections 和 number ...

mysql連線數過多

如果您得到 too many connections 錯誤資訊,並且想要了解正在發生的情況,本語句是非常有用的。mysql保留乙個額外的連線,讓擁有super許可權的 賬戶使用,以確保管理員能夠隨時連線和檢查系統 假設您沒有把此許可權給予所有的使用者 show processlist檢視連線數目 k...

mySQL連線數過多的問題

當你試圖連線到mysqld伺服器時遇到 過多連線 錯誤,這表示所有可用的連線均已被其他客戶端使用。允許的連線數由max connections 系統變數控制。預設值為100 如果需要支援更多的連線,應使用該變數的較大值重啟mysqld。mysqld實際上允許max connections 1 個客戶...