在早期運維工作中,檢視伺服器連線數一般都會用netstat命令。其實,有一個命令比netstat更高效,那就是ss(Socket Statistics)命令!
ss命令可以用來獲取socket統計資訊,它可以顯示和netstat類似的內容。
ss的優勢在於它能夠顯示更多更詳細的有關TCP和連線狀態的資訊,而且比netstat更快速更高效。原因如下:
1)當伺服器的socket連線數量變得非常大時,無論是使用netstat命令還是直接cat /proc/net/tcp,執行速度都會很慢。可能你不會有切身的感受,但請相信我,當伺服器維持的連線達到上萬個的時候,使用netstat等於浪費 生命,而用ss才是節省時間。
2)而ss快的祕訣在於它利用到了TCP協議棧中tcp_diag。tcp_diag是一個用於分析統計的模組,可以獲得Linux核心中第一手的資訊,這就確保了ss的快捷高效。當然,如果你的系統中沒有tcp_diag,ss也可以正常執行,只是效率會變得稍慢(但仍然比 netstat要快)。
為了驗證ss比netstat更快更高效,可以如下做幾個實驗看看效果:
幾乎所有的Linux系統都會預設包含netstat命令,但並非所有系統都會預設包含ss命令。
netstat命令是net-tools工具集中的一員,這個工具一般linux系統會預設安裝的;ss命令是iproute工具集中的一員;
net-tools是一套標準的Unix網路工具,用於配置網路介面、設定路由表資訊、管理ARP表、顯示和統計各類網路資訊等等,但是遺憾的是,這個工具自2001年起便不再更新和維護了。
iproute,這是一套可以支援IPv4/IPv6網路的用於管理TCP/UDP/IP網路的工具集
如果沒有ss命令,可以如下安裝:
[root@wang ~]# yum install iproute iproute-doc
當伺服器維持30000個socket連線時,使用netstat和ss命令統計連線數的耗時情況如下:
[root@wang ~]# netstat -at | wc -l //耗時15.60秒
[root@wang ~]# ss -atr | wc -l //耗時5.40秒(未利用tcp_diag)
[root@wang ~]# ss -atr | wc -l //耗時0.47秒(利用tcp_diag)
ss -a 檢視機器的socket連線數
ss -l 檢視機器的埠情況
ss -s 檢視機器的網路連線數
1)檢視當前伺服器的網路連線統計。
在伺服器產生大量sockets連線時,一般常會使用這個命令做巨集觀統計。
[root@wang ~]# ss -s
Total: 318 (kernel 419) TCP: 62 (estab 16, closed 18, orphaned 0, synrecv 0, timewait 17/0), ports 198 Transport Total IP IPv6 * 419 - - RAW 0 0 0 UDP 18 18 0 TCP 44 44 0 INET 62 62 0 FRAG 0 0 0
2)檢視所有開啟的網路埠
如果使用-pl引數的話,則會列出具體的程式名稱
[root@wang ~]# ss -l
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:rquotad *:*
LISTEN 0 128 *:46700 *:*
LISTEN 0 100 *:sun-as-jmxrmi *:*
LISTEN 0 128 *:40591 *:*
LISTEN 0 128 *:sunrpc *:*
LISTEN 0 128 *:webcache *:*
........
3)想檢視這臺伺服器上所有的socket連線
如果只想檢視TCP sockets,那麼使用-ta選項;
如果只想檢視UDP sockets,那麼使用-ua選項;
如果只想檢視RAW sockets,那麼使用-wa選項;
如果只想檢視UNIX sockets,那麼使用-xa選項。
[root@wang ~]# ss -a
......
ESTAB 0 0 101.201.114.106:54957 111.205.224.15:https
TIME-WAIT 0 0 10.25.91.53:58645 10.44.183.73:11212
TIME-WAIT 0 0 10.25.91.53:35920 10.171.60.171:11212
TIME-WAIT 0 0 10.25.91.53:http 100.109.192.96:17837
ESTAB 0 0 101.201.114.106:57479 139.196.38.174:56516
TIME-WAIT 0 0 127.0.0.1:cslistener 127.0.0.1:42728
--------------------------netstat中的各種狀態------------------------------
CLOSED 初始(無連線)狀態。 LISTEN 偵聽狀態,等待遠端機器的連線請求。 SYN_SEND 在TCP三次握手期間,主動連線端傳送了SYN包後,進入SYN_SEND狀態,等待對方的ACK包。 SYN_RECV 在TCP三次握手期間,主動連線端收到SYN包後,進入SYN_RECV狀態。 ESTABLISHED 完成TCP三次握手後,主動連線端進入ESTABLISHED狀態。此時,TCP連線已經建立,可以進行通訊。 FIN_WAIT_1 在TCP四次揮手時,主動關閉端傳送FIN包後,進入FIN_WAIT_1狀態。 FIN_WAIT_2 在TCP四次揮手時,主動關閉端收到ACK包後,進入FIN_WAIT_2狀態。 TIME_WAIT 在TCP四次揮手時,主動關閉端傳送了ACK包之後,進入TIME_WAIT狀態,等待最多MSL時間,讓被動關閉端收到ACK包。 CLOSING 在TCP四次揮手期間,主動關閉端傳送了FIN包後,沒有收到對應的ACK包,卻收到對方的FIN包,此時,進入CLOSING狀態。 CLOSE_WAIT 在TCP四次揮手期間,被動關閉端收到FIN包後,進入CLOSE_WAIT狀態。 LAST_ACK 在TCP四次揮手時,被動關閉端傳送FIN包後,進入LAST_ACK狀態,等待對方的ACK包。 主動連線端可能的狀態有: CLOSED SYN_SEND ESTABLISHED 主動關閉端可能的狀態有: FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT 被動連線端可能的狀態有: LISTEN SYN_RECV ESTABLISHED 被動關閉端可能的狀態有: CLOSE_WAIT LAST_ACK CLOSED 在Linux下,如果連線數比較大,可以使用效率更高的ss來替代netstat。 檢視tomcat的併發數:netstat -an|grep 10050|awk '{count[$6]++} END{for (i in count) print(i,count[i])}'