ss 用来获取系统 Socket 网络统计信息,英文 Socket Statistics 的缩写。功能与 netstat 类似,但 ss 能显示更多更详细的信息,并且更快更高效。

服务器的 Socket 连接数变得非常大时,无论是使用 netstat 命令还是直接 cat /proc/net/tcp,执行速度都会很慢。

ss 快的秘诀在于,它利用到了 TCP 协议栈中 tcp_diagtcp_diag 是一个用于分析统计的模块,可以获得 Linux 内核中第一手的信息,这就确保了 ss 的快捷高效。当然,如果你的系统中没有 tcp_diagss 也可以正常运行,只是效率会变得稍慢。(但仍然比 netstat 要快)

命令格式

1
2
ss [ OPTIONS ]
ss [ OPTIONS ] [ FILTER ]

命令参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-h, --help          帮助信息
-V, —version        程序版本信息
-n, —numeric        不解析服务名称
-r, —resolve        解析主机名
-a, —all            显示所有套接字(sockets)
-l, —listening      显示监听状态的套接字(sockets)
-o, —options        显示计时器信息
-e, —extended       显示详细的套接字(sockets)信息
-m, —memory         显示套接字(socket)的内存使用情况
-p, —processes      显示使用套接字(socket)的进程
-i, —info           显示 TCP 内部信息
-s, —summary        显示套接字(socket)使用概况

-4, —ipv4           仅显示 IPv4 的套接字(sockets)
-6, —ipv6           仅显示 IPv6 的套接字(sockets)
-0, —packet         显示 PACKET 套接字(socket)
-t, —tcp            仅显示 TCP 套接字(sockets)
-u, —udp            仅显示 UCP 套接字(sockets)
-d, —dccp           仅显示 DCCP 套接字(sockets)
-w, —raw            仅显示 RAW 套接字(sockets)
-x, —unix           仅显示 Unix 套接字(sockets)
-f, —family=FAMILY  显示 FAMILY 类型的套接字(sockets)
        FAMILY 可选,支持 unix, inet, inet6, link, netlink

-A, —query=QUERY, —socket=QUERY
        QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

-D, —diag=FILE      将原始 TCP 套接字(sockets)信息转储到文件
-F, —filter=FILE    从文件中都去过滤器信息
        FILTER := [ state TCP-STATE ] [ EXPRESSION ]

应用实例

显示 socket 概况

命令:

1
ss -s

结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Total: 260 (kernel 329)
TCP:   611 (estab 104, closed 487, orphaned 0, synrecv 0, timewait 482/0), ports 257

Transport Total     IP        IPv6
*	  329       -         -
RAW	  0         0         0
UDP	  1         1         0
TCP	  124       124       0
INET	  125       125       0
FRAG	  0         0         0

列出所有监听的网络端口

命令:

1
ss -l

结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
State       Recv-Q Send-Q           Local Address:Port               Peer Address:Port
LISTEN      0      511                          *:cbt                           *:*
LISTEN      0      128                  127.0.0.1:smux                          *:*
LISTEN      0      128                          *:23432                         *:*
LISTEN      0      1024                 127.0.0.1:11211                         *:*
LISTEN      0      20                           *:submission                       *:*
LISTEN      0      128                          *:10060                         *:*
LISTEN      0      511                          *:distinct                       *:*
LISTEN      0      511                          *:http                          *:*
LISTEN      0      20                           *:urd                           *:*
LISTEN      0      32                           *:ftp                           *:*
LISTEN      0      20                           *:smtp                          *:*

显示 TCP 连接信息

命令:

1
ss -t

结果:

1
2
3
4
5
6
7
State       Recv-Q Send-Q           Local Address:Port               Peer Address:Port
ESTAB       0      0                10.30.177.121:32976             10.142.134.58:mysql
ESTAB       0      0                10.30.177.121:31530               10.31.83.60:18086
ESTAB       0      0                118.190.68.90:http             118.190.64.128:48503
ESTAB       0      0                10.30.117.181:32598               10.31.83.60:18086
ESTAB       0      0                118.190.68.90:33090            183.106.128.47:wap-wsp
ESTAB       0      0                10.30.177.121:31390               10.31.83.60:18086

ss 和 netstat 效率对比

命令:

1
2
time netstat -at
time ss

结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$ time netstat -at

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 *:cbt                       *:*                         LISTEN
tcp        0      0 localhost:smux              *:*                         LISTEN
tcp        0      0 *:23432                     *:*                         LISTEN
tcp        0      0 localhost:memcache          *:*                         LISTEN
tcp        0      0 *:submission                *:*                         LISTEN
tcp        0      0 *:10060                     *:*                         LISTEN
tcp        0      0 *:distinct                  *:*                         LISTEN
tcp        0      0 *:http                      *:*                         LISTEN
tcp        0      0 *:urd                       *:*                         LISTEN
tcp        0      0 *:ftp                       *:*                         LISTEN
tcp        0      0 *:smtp                      *:*                         LISTEN

... ... ...

real	1m46.399s
user	0m0.084s
sys	0m0.083s
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ time ss -l
State       Recv-Q Send-Q           Local Address:Port               Peer Address:Port
LISTEN      0      511                          *:cbt                           *:*
LISTEN      0      128                  127.0.0.1:smux                          *:*
LISTEN      0      128                          *:23432                         *:*
LISTEN      0      1024                 127.0.0.1:11211                         *:*
LISTEN      0      20                           *:submission                       *:*
LISTEN      0      128                          *:10060                         *:*
LISTEN      0      511                          *:distinct                       *:*
LISTEN      0      511                          *:http                          *:*
LISTEN      0      20                           *:urd                           *:*
LISTEN      0      32                           *:ftp                           *:*
LISTEN      0      20                           *:smtp                          *:*

real	0m0.010s
user	0m0.004s
sys	0m0.003s

由此可见,socket 数量越多,效率差异越明显,ss 效率比 netstat 快太多。

参考资料