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要快)。linux

爲了驗證ss比netstat更快更高效,能夠以下作幾個實驗看看效果:
幾乎全部的Linux系統都會默認包含netstat命令,但並不是全部系統都會默認包含ss命令。
netstat命令是net-tools工具集中的一員,這個工具通常linux系統會默認安裝的;ss命令是iproute工具集中的一員;
net-tools是一套標準的Unix網絡工具,用於配置網絡接口、設置路由表信息、管理ARP表、顯示和統計各種網絡信息等等,可是遺憾的是,這個工具自2001年起便再也不更新和維護了。
iproute,這是一套能夠支持IPv4/IPv6網絡的用於管理TCP/UDP/IP網絡的工具集web

若是沒有ss命令,能夠以下安裝:
[root@wang ~]# yum install iproute iproute-doc tomcat

當服務器維持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) bash

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])}'
相關文章
相關標籤/搜索