
在 Linux 伺服器上可以使用,netstat -tan | grep ESTABLISHED| wc -l
但這不適用於具有watch -n1
.
如果伺服器不是很忙或監控間隔足夠大,這種方法就可以很好地工作。但是可以推薦什麼作為高負載伺服器的替代方案呢?
答案1
使用/proc減少工作量
我喜歡訪問核心變數直接通過/proc
.這是非常有效率、快速且系統化的。
有一個名為「核心變數表」的偽文件,/proc/net/tcp
其中核心儲存 TCP 連接和監聽的清單。第 6 個欄位稱為st
為了狀態可以包含0A
監聽條目和01
已建立的連線。
數數傳輸控制協定 已確立的連接:
透過使用grepgrep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
透過使用awk
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
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
答案4
還有 lsof,它可以按協定和狀態進行過濾:例如查找 TCP ESTABLISHED 連線:
~# lsof -i tcp -s tcp:ESTABLISHED
那麼| wc -l 來計數。注意:沒有嘗試使用大量連線的成本。