ss是Socket Statistics的縮寫。mysql
顧名思義,ss命令能夠用來獲取socket統計信息,它能夠顯示和netstat相似的內容。但ss的優點在於它可以顯示更多更詳細的有關TCP和鏈接狀態的信息,並且比netstat更快速更高效。linux
【和netstat說再見的緣由】nginx
當服務器的socket鏈接數量變得很是大時,不管是使用netstat命令仍是直接cat /proc/net/tcp,執行速度都會很慢。可能你不會有切身的感覺,但請相信我,當服務器維持的鏈接達到上萬個的時候,使用netstat等於浪費 生命,而用ss纔是節省時間。web
天下武功惟快不破。ss快的祕訣在於,它利用到了TCP協議棧中tcp_diag。tcp_diag是一個用於分析統計的模塊,能夠得到Linux 內核中第一手的信息,這就確保了ss的快捷高效。固然,若是你的系統中沒有tcp_diag,ss也能夠正常運行,只是效率會變得稍慢。(但仍然比 netstat要快。)sql
【用數聽說話】服務器
爲了讓你更堅定的和netstat說再見,列舉一些測試數據,以便證實ss的確名不虛傳。網絡
當服務器維持3萬個socket鏈接,Admin須要計算具體的鏈接數量時,不一樣狀況的耗時以下:app
1
2
3
|
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
1
2
|
#rpm -q net-tools
net-tools-1.60-109.el6.i686
|
而ss命令是iproute工具集中的一員:
1
2
3
4
|
#rpm -qf /usr/sbin/ss
iproute-2.6.32-17.el6.i686
#rpm -q iproute
iproute-2.6.32-17.el6.i686
|
若是你沒法使用ss命令,那麼多是缺乏了iproute,須要安裝一下:
1
|
yum
install
iproute iproute-doc
|
【前浪net-tools和後浪iproute】
net-tools是一套標準的Unix網絡工具,用於配置網絡接口、設置路由表信息、管理ARP表、顯示和統計各種網絡信息等等,可是遺憾的是,這個工具自2001年起便再也不更新和維護了。
即將隆重登場的即是iproute,這是一套能夠支持IPv4/IPv6網絡的用於管理TCP/UDP/IP網絡的工具集,這套工具由Stephen Hemminger負責維護和升級,目前的大版本號是2。
從某種意義上說,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選項。
若是想深刻體驗LINUX系統的新手,也能夠先下載一個方德Linux軟件中心試用一下。
免費下載地址:http://www.nfs-cloud.cn:81/appCenter/open/softcenter