ss命令输出中Recv-Q、Send-Q的含义
首先,为什么ss比netstat快:
netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多。
[root@VM_0_11_centos ~]# ss -tan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:27017 *:*
连接状态、(这个连接的)接收队列(缓冲区)、发送队列(缓冲区)、本地地址和端口、对端地址和端口
[root@VM_0_11_centos ~]# ss -tan|grep 3306
TIME-WAIT 0 0 127.0.0.1:48782 127.0.0.1:3306
TIME-WAIT 0 0 127.0.0.1:48766 127.0.0.1:3306
TIME-WAIT 0 0 127.0.0.1:48816 127.0.0.1:3306
TIME-WAIT 0 0 127.0.0.1:48796 127.0.0.1:3306
LISTEN 0 128 :::3306 :::*
查看一下本地mysql的连接,4个time_wait应该是本地prometheus的mysql监控留下的,
然后最后LISTEN应该就是mysql的监听3306端口的server socket了,这里的疑问是为什么Send-Q发送队列会是128?
原因是Recv-Q Send-Q在LISTEN状态的连接与其他状态的连接的含义有所不同,
LISTEN状态Recv-Q指的是当前已完成establis而在accept队列里等待应用程序accept的连接数,而Send-Q则是指的这个队列的最大长度。等于min(backlog, somaxconn);
其他状态连接的Recv-Q Send-Q的含义分别是该连接在内核空间中当前读缓冲区和写缓冲区的字节大小。
网络程序底层,以服务端接收数据包为例,是内核通过tcp协议栈程序先把数据读到内核缓冲区,然后应用程序发起系统调用recv,把数据从内核缓冲区中读到自己的内存,
我们叫CPU从内核态到用户态工作,然后应用程序就可以处理这部分数据了。