linux中netstat和ss命令详解

由于nio的普及,ck10k的问题已经成为过去式 。现在随便一台服务器,就可以支持数十万级别的连接了 。那么我们来算一下,100万的连接需要多少资源 。
首先,每一个连接都是文件句柄,所以需要文件描述符数量支持才行,每一个socket内存占用15k-20k之间,这样,仅维护相应socket,就需要20G内存;而广播一个1KB的消息需要占用的带宽为1000M!
由于nio的普及,ck10k的问题已经成为过去式 。现在随便一台服务器,都可以支持数十万级别的连接了 。
那么10万的连接需要多少资源呢?
由于一个连接都是文件句柄,所以需要文件描述符数量支持才行,每一个socket内存占用15k-20k之间,这样,仅维护相应socket,就需要20kx10万=2G内存;而广播一个1KB的消息需要占用的带宽为100M
如何查看当前系统有多少连接呢
查看当前系统的连接[root@VM_0_15_centos ~]# netstat -antp | awk '{a[$6]++}END{ for(x in a)print x,a[x]}'LISTEN 13ESTABLISHED 5established) 1Foreign 1TIME_WAIT 5但如果你在一台有上万连接的服务器上执行这个命令,你可能会等上很长时间 。所以,我们有了第二代网络状态统计工具:netstat => ss
如果你在一台有上万连接的服务器上执行这个命令,可能会很卡 。但是我们有了更好的替代方案ss命令
[root@VM_0_15_centos ~]# ss -sTotal: 252 (kernel 294)TCP:24 (estab 5, closed 6, orphaned 0, synrecv 0, timewait 4/0), ports 0Transport TotalIPIPv6*294--RAW000UDP853TCP18153INET26206FRAG000下面我们详解2个命令的用法
1.netstat命令
netstat 命令:用于显示各种网络相关信息,如网络连接,路由表,接口统计状态,无效连接,组播成员 等等 。
netstat命令是net-tools软件包中的一员
选项:-a:列出系统中所有网络连接,包括已经连接的网络服务、监听的网络服务和Socket套接字-t:列出TCP数据-u:列出UDP数据-l:列出正在监听的网络服务(不包含已经连接的网路服务)-n:用端口显示服务,而不用服务名-p:列出该服务的进程ID(PID)2.ss命令
ss是Socket Statistics的缩写
ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容 。但是ss的优势在于它能够显示更详细的有关网络连接的状态信息,而比netstat更快速、更高效 。
ss命令是iproute2软件包中的一员
查看服务器上所有的socket连接
[root@dev logs]# ss -aStateRecv-Q Send-QLocal Address:PortPeer Address:PortLISTEN0128*:51204*:*LISTEN064*:rsync*:*LISTEN07*:svn*:*LISTEN050*:MySQL*:*LISTEN050*:netbIOS-ssn*:*查看TCP sockets,使用-ta选项查看UDP sockets,使用-ua选项查看RAW sockets,使用-wa选项查看UNIX sockets,使用-xa选项
重点说明一下Recv-Q和Send-Q
在LISTEN和ESTAB状态分别代表不同意义 。正常的应用程序这两个值都应该为0(backlog除外) 。数值越大,说明问题越严重 。
LISTEN状态Recv-Q:代表建立的连接还有多少没有被accept,比如Nginx接受新连接变的很慢Send-Q:代表listen backlog值ESTAB状态Recv-Q:内核中的数据还有多少(bytes)没有被应用程序读取,发生了一定程度的阻塞Send-Q:代表内核中发送队列里还有多少(bytes)数据没有收到ack,对端的接收处理能力不强
和某个ip的所有连接
ss dst 10.66.224.130ss dst 10.66.224.130:httpss dst 10.66.224.130:smtpss dst 10.66.224.130:443显示所有的http连接
ssdport = :http和某个ip的所有连接ss dst 10.66.224.130ss dst 10.66.224.130:httpss dst 10.66.224.130:smtpss dst 10.66.224.130:443
显示所有的http连接ss dport = :http
查看连接本机最多的前10个ip地址
查看连接本机最多的前10个ip地址
【linux中netstat和ss命令详解】netstat -antp | awk '{print $4}' | cut -d ':' -f1 | sort | uniq -c| sort -n -k1 -r | head -n 10netstat -antp | awk '{print $4}' | cut -d ':' -f1 | sort | uniq -c | sort -n -k1 -r | head -n 10
查看TCP sockets,使用-ta选项
查看UDP sockets,使用-ua选项
查看RAW sockets,使用-wa选项
查看UNIX sockets,使用-xa选项
查看TCP sockets,使用-ta选项
查看UDP sockets,使用-ua选项
查看RAW sockets,使用-wa选项
查看UNIX sockets,使用-xa选项
3.net-tools iproute2替换命令
net-tools起源于BSD的TCP/IP工具箱,后来成为老版本linux内核中配置网络功能的工具 。但自2001年起,Linux社区已经对其停止维护 。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持iproute2
作为网络配置工具的一份子,iproute2的出现旨在从功能上取代net-tools 。net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯 。


推荐阅读