天天看點

《篡權的ss》-linux指令五分鐘系列之三十一

上篇文章《和netstat說再見》中說到netstat已經被抛棄,取而代之的是ss指令。一些朋友在問“netstat為什麼會被抛棄呢?ss又是什麼指令呢?”

這篇文章,我們就來揭曉答案,重點說一說“篡權的ss”。

【作者粗心大意?】

ss指令是一個用來檢視socket資訊的指令,通過man ss可以看到,這是由一位俄羅斯人編寫的工具,作者的名字顯示是Alexey Kuznetosv。

《篡權的ss》-linux指令五分鐘系列之三十一

但是,當我google這個名字,或者根據作者提供的郵箱位址所在的網站去檢視,都發現他的名字本應是Alexey Kuznetsov,差別在于最後的tsov或者tosv。

因為沒有學過俄語,是以不知道俄語裡是不是本身就允許這樣颠倒字母順序,但是我還是發了封email用英語提醒了一下他,看看是不是因為Alexey粗心大意,連自己的名字都寫錯了。

如果tsov和tosv是的确是同一個人的話,那麼我搜尋到的這位便是ss的作者了:

《篡權的ss》-linux指令五分鐘系列之三十一

Alexey目前已經不負責ss指令的維護更新,而是在專注于Linux Kernel QoS方面的工作。

【十秒認識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:

《篡權的ss》-linux指令五分鐘系列之三十一

從某種意義上說,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選項。

【參考文獻】

繼續閱讀