上篇文章《和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 |
位址和鍊路配置 | 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選項。
【參考文獻】