Linux 使用ss命令代替 netstat

ss是Socket Statistics的縮寫。 html

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

【和netstat說再見的緣由】 linux

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

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

【用數聽說話】 sql

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

當服務器維持3萬個socket鏈接,Admin須要計算具體的鏈接數量時,不一樣狀況的耗時以下: 網絡

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

【好馬配上好鞍】 socket

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

#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

相關文章
相關標籤/搜索