ss简介

ssSocket 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_diagss也可以正常运行,只是效率会变得稍慢。(但仍然比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链接的数量,其中数组的keyTCP连接的状态,value是每个状态对应的value。执行结果如下:

ss统计结果