前幾天有某台伺服器出現 Connection 爆量的問題,導致伺服器無法運作,雖然調大 Connection 就能解決問題,但還是必須了解目前系統的用量有多少,避免造成不必要的資源浪費。
要查看 Connection 可以用 netstat 來查看目前所有的 Connection,但做為系統管理人員小弟說過要有懶惰的美德,凡事不要自己來,讓系統自動化才是最明確的決定。
目標是希望可以定時監控 80 Port 的 Connection 數量
撰寫一隻批次檔,用到 Windows 的 netstat ,還有 Linux 的 cut 來區隔來源及目的
範例1;篩選出 TCP 中 192.168.10.99 這張網卡的 80port
netstat -anp tcp | find "192.168.10.99:80" C:\Users\Administrator>netstat -anp tcp | find "192.168.10.99:80" TCP 192.168.10.99:80 192.168.100.1:39082 ESTABLISHED TCP 192.168.10.99:80 192.168.100.1:39084 ESTABLISHED TCP 192.168.100.1:39082 192.168.10.99:80 ESTABLISHED TCP 192.168.100.1:39084 192.168.10.99:80 ESTABLISHED
範例2;將 範例1 篩選出的結果計算數量
netstat -anp tcp | find "192.168.10.99:80" /c 4
如果系統是 80 port 出口的話,與 user 端就會有 輸入及輸出兩筆 Connection。
雖然懶人可以用除以2 的方式來算出數量,但心裡還是覺得有出錯的機會。
由於找不到 Windows 的篩選 command ,先用了 Linux 的 cut 加入本機源的判斷。
※要在 Windows 用 Linux 的 command 可以下載 coreutils ,安裝 coreutils 你會需要擁有 libintl3.dll、libiconv2.dll ,請丟到與 cut.exe 相同目錄下。
建立 ConnectionMonitor.bat 批次檔
set BINPATH=D:\coreutils-5.3.0-bin\bin echo | set /p = %date% >> D:\log.txt netstat -anp tcp | find "192.168.10.99:80" | %BINPATH%\cut -d " " -f 7 | find "192.168.10.99:80" /c >> D:\log.txt
所呈現的執行結果會是以下
201410310100 4
echo | set /p = %date% 是為了判讀當下執行的時間, set /p 是不希望 echo 有段行
cut -d ” ” -f 7 是判別到 192.168.10.99:80 之前有 7 格空格,這是比較原始的方法,如果網友有更好的方法也可以提出!
最後加入工作排程,並寫入 Log,一段時間後就可以得知 Connection 的狀況囉!!