使用 ss 命令代替 netstat

ss是Socket Statistics的缩写。

顾名思义, ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

为什么要告别netstat

当服务器的socket连接数非常大时,无论使用netstat还是cat /proc/net/tcp,执行速度都很慢。

天下武功唯快不破。ss的秘诀在于,它利用到了TCP协议栈中tcp_diag。

tcp_diag是一个用于分析统计的模块,可以获得linux内核中第一手信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得很慢(仍然比netstat快)。

性能对比

TODO

自己手头暂时没有适合测试的机器,网上有人测试过数据如下:

(当服务器维持3w个socket链接时)

1
2
3
netstat -at | wc 耗时 15.60 秒
ss -atr | wc 耗时 5.40 秒(未利用tcp_diag)
ss -atr | wc 耗时 0.47 秒(利用tcp_diag)

安装ss

几乎所有的linux系统都会默认包含netstat命令,但并非所有系统都会默认包含ss命令。

netstat命令是net-tools工具集中的一员:

1
2
$rpm -q netstat-tools
net-tools-1.60-110.el6_2.x86_64

而ss命令是iproute工具集中的一员:

1
2
3
4
$rpm -q /usr/sbin/ss
iproute-2.6.32-45.el6.x86_64
$rpm -q iproute
iproute-2.6.32-45.el6.x86_64

如果你无法使用ss命令,那么可能是缺少了iproute,需要安装一下:

1
yum install iproute iproute-doc

ss常见用法

当前服务器的网络连接统计

1
2
3
4
5
6
7
8
9
10
11
$ ss -s
Total: 78 (kernel 85)
TCP: 5 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 5
Transport Total IP IPv6
* 85 - -
RAW 0 0 0
UDP 4 4 0
TCP 5 5 0
INET 9 9 0
FRAG 0 0 0

查看所有打开的网络接口以及对应的程序名称

1
2
3
4
5
6
7
8
9
10
$ ss -pl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:http *:*
users:(("nginx",2591,6),("nginx",15272,6))
LISTEN 0 10 127.0.0.1:15770 *:*
users:(("aegis_quartz",16616,8))
LISTEN 0 128 *:22 *:*
users:(("sshd",24244,3))
```
**查看所有socket连接**

$ ss -a

1
2
3
4
5
6
7
* 如果只想查看TCP sockets, 那么使用 `-ta` 选项
* 如果只想查看UDP sockets, 那么使用 `-ua` 选项
* 如果只想查看RAW sockets, 那么使用 `-wa` 选项
* 如果只想查看UNIX sockets, 那么使用 `-xa` 选项
#### 附录
#####ss命令参数列表

-h, --help
       Show summary of options.

-V, --version
       Output version information.

-n, --numeric
       Do now try to resolve service names.

-r, --resolve
       Try to resolve numeric address/ports.

-a, --all
       Display all sockets.

-l, --listening
       Display listening sockets.

-o, --options
       Show timer information.

-e, --extended
       Show detailed socket information

-m, --memory
       Show socket memory usage.

-p, --processes
       Show process using socket.

-i, --info
       Show internal TCP information.

-s, --summary
       Print  summary  statistics. This option does not parse socket lists obtaining summary from various sources.
       It is useful when amount of sockets is so huge that parsing /proc/net/tcp is painful.

-4, --ipv4
       Display only IP version 4 sockets (alias for -f inet).

-6, --ipv6
       Display only IP version 6 sockets (alias for -f inet6).

-0, --packet
       Display PACKET sockets.

-t, --tcp
       Display only TCP sockets.

```

iproute & net-tools

从某种意义上来说,iproute工具集几乎可以替代掉net-tools工具集。

用途 net-tools iproute2
地址和链路配置 ifconfig ip addr, ip link
路由表 route ip route
邻居 arp ip neigh
VLAN vconfig ip link
隧道 iptunnel ip tunnel
组播 ipmaddr ip maddr
统计 netstat ss

netstat2iproute