Linux 命令--SS

ss是Socket Statistics的縮寫。

顧名思義,ss命令可以用來獲取socket統計信息,它可以顯示和netstat類似的內容。但ss的優勢在於它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。

【和netstat說再見的原因】

當服務器的socket連接數量變得非常大時,無論是使用netstat命令還是直接cat /proc/net/tcp,執行速度都會很慢。可能你不會有切身的感受,但請相信我,當服務器維持的連接達到上萬個的時候,使用netstat等於浪費 生命,而用ss纔是節省時間。

天下武功唯快不破。ss快的祕訣在於,它利用到了TCP協議棧中tcp_diag。tcp_diag是一個用於分析統計的模塊,可以獲得Linux 內核中第一手的信息,這就確保了ss的快捷高效。當然,如果你的系統中沒有tcp_diag,ss也可以正常運行,只是效率會變得稍慢。(但仍然比 netstat要快。)

【用數據說話】

爲了讓你更堅決的和netstat說再見,列舉一些測試數據,以便證明ss的確名不虛傳。

當服務器維持3萬個socket連接,Admin需要計算具體的連接數量時,不同情況的耗時如下:

netstat -at | wc  耗時 15.60 秒
ss -atr     | wc  耗時  5.40 秒(未利用tcp_diag)
ss -atr     | wc  耗時  0.47 秒(利用tcp_diag)

【好馬配上好鞍】

幾乎所有的Linux系統都會默認包含netstat命令,但並非所有系統都會默認包含ss命令。netstat命令是net-tools工具集中的一員:

#rpm -q net-tools
net-tools-1.60-109.el6.i686

而ss命令是iproute工具集中的一員:

#rpm -qf /usr/sbin/ss
iproute-2.6.32-17.el6.i686
#rpm -q iproute
iproute-2.6.32-17.el6.i686

如果你無法使用ss命令,那麼可能是缺少了iproute,需要安裝一下:

yum install iproute iproute-doc

【前浪net-tools和後浪iproute】

net-tools是一套標準的Unix網絡工具,用於配置網絡接口、設置路由表信息、管理ARP表、顯示和統計各類網絡信息等等,但是遺憾的是,這個工具自2001年起便不再更新和維護了。

長江後浪推薦前浪。

即將隆重登場的便是iproute,這是一套可以支持IPv4/IPv6網絡的用於管理TCP/UDP/IP網絡的工具集,這套工具由Stephen Hemminger負責維護和升級,目前的大版本號是2。我們來認識一下Stephen:

從某種意義上說,iproute工具集幾乎可以替代掉net-tools工具集,具體的替代方案是這樣的:

用途 net-tool(被淘汰) iproute2
地址和鏈路配置 ifconfig ip addr, ip link
路由表 route ip route
鄰居 arp ip neigh
VLAN vconfig ip link
隧道 iptunnel ip tunnel
組播 ipmaddr ip maddr
統計 netstat ss

【版本和幫助】

想獲得ss命令的幫助信息和版本信息,都非常簡單,你應該可以猜到的:

#ss -h //獲得幫助信息,直接man ss會更全面
#ss -V //取得版本號,-v也支持
ss utility, iproute2-ss091226

【ss選項統計】

ss的選項既不多也不復雜,除去非功能性選項(-h/-v)外,ss共有22個選項。

每一個選項都是既支持短選項(如-s),也支持長選項(如–summary)。

我們不會在這裏一一介紹,因爲這樣既枯燥又乏味,而且不出三分鐘,你就會昏昏欲睡了。所以,我們會從實際需求和實際問題出發,這樣效果會好些。

【場景一:我想查看當前服務器的網絡連接統計】

$ ss -s
Total: 295 (kernel 312)
TCP:   48 (estab 1, closed 31, orphaned 0, synrecv 0, timewait 0/0), ports 13

Transport Total     IP        IPv6
*         312       -         -
RAW       0         0         0
UDP       2         2         0
TCP       17        12        5
INET      19        14        5
FRAG      0         0         0

在服務器產生大量sockets連接時,我們會使用這個命令在做宏觀統計。

【場景二:我想查看所有打開的網絡端口】

$ ss -l
Recv-Q Send-Q           Local Address:Port               Peer Address:Port
0      128                         :::webcache                      :::*
0      128                         :::http                         :::*
0      128                         :::snapenetio                      :::*
0      128                          *:snapenetio                       *:*
0      50                           *:8531                          *:*
0      9                           :::ftp                          :::*
0      9                            *:ftp                           *:*
0      128                          *:ddi-tcp-1                       *:*
0      100                        ::1:smtp                         :::*
0      100                  127.0.0.1:smtp                          *:*
0      128                          *:8541                          *:*
0      128                  127.0.0.1:entextxid                       *:*
0      50                           *:12421                         *:*
0      10                           *:amqp                          *:*
0      128                          *:12521                         *:*
0      50                           *:mysql                         *:*

如果使用-pl參數的話,則會列出具體的程序名稱。你會在輸出中看到類似於這樣的內容:

("nginx",15786,6)

從中可以知道,某個socket連接是屬於nginx程序的,nginx程序的PID是15786。

【場景三:我想查看這臺服務器上所有的socket連接】

很簡單,直接使用-a選項即可列出所有網絡連接。

#ss -a

如果只想查看TCP sockets,那麼使用-ta選項;
如果只想查看UDP sockets,那麼使用-ua選項;
如果只想查看RAW sockets,那麼使用-wa選項;
如果只想查看UNIX sockets,那麼使用-xa選項。

【參考文獻】

1 http://en.wikipedia.org/wiki/Iproute2
2 http://en.wikipedia.org/wiki/Netstat
3 http://www.cyberciti.biz/files/ss.html
4 http://it.toolbox.com/blogs/locutus/what-is-this-ss-program-thingy-14083
5 http://www.cyberciti.biz/tips/linux-investigate-sockets-network-connections.html
6 http://www.policyrouting.org/iproute2.doc.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章