ss简介
ss
是Socket Statistics
的缩写。顾名思义,ss
命令可以用来获取socket
统计信息,它可以显示和netstat
类似的内容。但ss
的优势在于它能够显示更多更详细的有关TCP
和连接状态的信息,而且比netstat
更快速更高效。
ss和netstat的区别
当服务器的socket
连接数量变得非常大时,无论是使用netstat
命令还是直接cat /proc/net/tcp
,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat
等于浪费生命(我在公司的线上服务器用过netstat
,真的想哭,速度之慢,简直让你怀疑人生),而用ss
才是节省时间。
天下武功唯快不破。ss
快的秘诀在于,它利用到了TCP
协议栈中tcp_diag
。
ss为啥速度快
tcp_diag
是一个用于分析统计的模块,可以获得Linux
内核中第一手的信息,这就确保了ss
的快捷高效。当然,如果你的系统中没有tcp_diag
,ss
也可以正常运行,只是效率会变得稍慢。(但仍然比netstat
要快).
ps:其实我也不知道什么是tcp_diag,但是为了装逼,就把上面的一句话沾上了。
命令格式
ss
[参数]
ss
命令参数
ss
有很多参数,但是工作中常用的参数并不多,我只列出了我在工作中用到的几个参数,如下,其他的参数可以参考文档(其实你基本上用不到其他的参数)
-n
, 不解析服务名称,不要将ip
地址和port
端口逆向解析,节省时间
-a
, 显示所有套接字(sockets
)
-l
, 显示监听状态的套接字
-t
, 仅显示TCP
套接字
-u
, 仅显示UCP
套接字
实例用法
我在公司中经常使用`ss`命令统计每个服务器上面的链接数量,分析服务器的状况,指令如下:
ss -tan | awk 'NR>1{socket[$1]++} END{for (i in socket) print i,"<--->",socket[i]}'
在上面的例子中,socket
数组保存了处于各种状态的TCP
链接的数量,其中数组的key
为TCP
连接的状态,value
是每个状态对应的value
。执行结果如下:
ss统计结果