取得 TCP 建立的連線數

取得 TCP 建立的連線數

在 Linux 伺服器上可以使用,netstat -tan | grep ESTABLISHED| wc -l但這不適用於具有watch -n1.

如果伺服器不是很忙或監控間隔足夠大,這種方法就可以很好地工作。但是可以推薦什麼作為高負載伺服器的替代方案呢?

答案1

使用/proc減少工作量

我喜歡訪問核心變數直接通過/proc.這是非常有效率、快速且系統化的。

有一個名為「核心變數表」的偽文件,/proc/net/tcp其中核心儲存 TCP 連接和監聽的清單。第 6 個欄位稱為st為了狀態可以包含0A監聽條目和01已建立的連線。

數數傳輸控制協定 已確立的連接:

透過使用
grep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
透過使用
awk  </proc/net/tcp 'BEGIN{t=0};{if ($4 == "01") {t++;}};END{print t}'

或者

awk  </proc/net/tcp 'BEGIN{t=0};/^ *[0-9]+: [0-9A-F: ]{27} 01 /{t++};END{print t}'
透過使用
sed  </proc/net/tcp '/^ *[0-9]\+: [0-9A-F: ]\{27\} 01 /p;d' | wc -l

執行時間處理時間

因為這個問題代表高工作負載系統。我做了一個小板凳:

方法以毫秒為單位回答

grep 技術 2.48
awk 無正規表示式 ($4=="01") 2.51
sed |廁所 2.67
awk 與正規表示式 2.93

ss -neopt 狀態建立 | wc -l 蘇普賈米 15.14
lsof -i tcp -s tcp:已建立 Tonioc 25055.00

好吧,托尼奧克的回答很慢,但他的冗長很有趣。因此顯然不適用於高工作負載系統。

這個工作台讓您看到,如果ss是一個非常有用的專用工具,那麼詢問/proc變數可能會快得多。

答案2

使用命令:

ss -neopt state established

這將僅向您顯示處於ESTABLISHED狀態的 TCP 會話,無需透過管道傳輸到其他命令,因此速度非常快。

ss比舊版本更好,netstat因為舊版本netstat只是從 procfs 中讀取,而 procfs 受檔案鎖定的影響。ss實際上在核心內部進行查詢,由核心調度程序處理並始終返回準確的資訊。

答案3

還檢查:527875

netstat + grep對於一些連接來說是一個很好且簡單的選擇,但如果您有大量連接,我會推薦ss按照中的建議進行推薦尼克工藝

例如:ss -s

Total: 78 (kernel 79)
TCP:   31 (estab 27, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 16

Transport Total     IP        IPv6
*     79        -         -        
RAW   0         0         0        
UDP   4         2         2        
TCP   31        2         29       
INET      35        4         31       
FRAG      0         0         0  

答案4

還有 lsof,它可以按協定和狀態進行過濾:例如查找 TCP ESTABLISHED 連線:

~# lsof -i tcp -s tcp:ESTABLISHED

那麼| wc -l 來計數。注意:沒有嘗試使用大量連線的成本。

相關內容