由于nio的普及,ck10k的问题已经成为过去式。现在随便一台服务器,就可以支持数十万级别的连接了。那么我们来算一下,100万的连接需要多少资源。
首先,每一个连接都是文件句柄,所以需要文件描述符数量支持才行,每一个socket内存占用15k-20k之间,这样,仅维护相应socket,就需要20G内存;而广播一个1KB的消息需要占用的带宽为1000M!
查看当前系统的连接
如何看当前系统有多少连接呢?可以使用netstat结合awk进行统计。如下脚本,统计了每一种状态的tcp连接数量
- # netstat -antp | awk '{a[$6]++}END{ for(x in a)print x,a[x]}'LISTEN 41CLOSE_WAIT 24ESTABLISHED 150Foreign 1TIME_WAIT 92
但如果你在一台有上万连接的服务器上执行这个命令,你可能会等上很长时间。所以,我们有了第二代网络状态统计工具:netstat => ss(可别和那个越狱工具搞混了)。
- # ss -sTotal: 191 (kernel 220)TCP: 5056 (estab 42, closed 5000, orphaned 3, synrecv 0, timewait 5000/0), ports 3469…
netstat属于net-tools工具集,而ss属于iproute。其命令对应如下,是时候和net-tools说Bye了。
用途 | net-tools | iproute |
---|---|---|
统计 | ifconfig | ss |
地址 | netstat | ip addr |
路由 | route | ip route |
邻居 | arp | ip neigh |
VPN | iptunnel | ip tunnel |
VLAN | vconfig | ip link |
组播 | ipmaddr | ip maddr |
ss命令
基本使用
我们按照使用场景来看下ss的用法。
查看系统正在监听的tcp连接
- ss -atr ss -atn #仅ip
查看系统中所有连接
- ss -alt
查看监听444端口的进程pid
- ss -ltp | grep 444
查看进程555占用了哪些端口
- ss -ltp | grep 555
显示所有udp连接
- ss -u -a
查看TCP sockets,使用-ta选项
查看UDP sockets,使用-ua选项
查看RAW sockets,使用-wa选项
查看UNIX sockets,使用-xa选项
和某个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地址
- netstat -antp | awk '{print $4}' | cut -d ':' -f1 | sort | uniq -c | sort -n -k1 -r | head -n 10