SS命令和Netstat命令比較


 

在早期運維工作中,查看服務器連接數一般都會用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])}'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM