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

相关文章
相关标签/搜索