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