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

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

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

【作者粗心大意?】

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

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

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

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

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:

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

用途net-tool(被淘汰)iproute2
地址和鏈路配置ifconfigip addr, ip link
路由表routeip route
鄰居arpip neigh
VLANvconfigip link
隧道iptunnelip tunnel
組播ipmaddrip maddr
統計netstatss

【版本和幫助】

想獲得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

謝謝您的閱讀![未完待續…]


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