真实面经题目 · 原创解析
netstat 中的 Recv-Q 和 Send-Q 有什么区别?
netstat 的 Recv-Q 和 Send-Q 分别反映 socket 接收队列和发送队列中的未处理数据。回答要区分监听 socket、已建立连接、应用是否及时读写,以及网络或对端是否导致堆积。
真实面经题目 · 原创解析
netstat 的 Recv-Q 和 Send-Q 分别反映 socket 接收队列和发送队列中的未处理数据。回答要区分监听 socket、已建立连接、应用是否及时读写,以及网络或对端是否导致堆积。
Recv-Q 可以理解为接收方向还没被应用消费的数据量,Send-Q 是发送方向已经由应用写入但还没被对端确认或内核完全发送出去的数据量。对 established 连接来说,Recv-Q 高通常说明本端应用没有及时 recv,或者处理太慢;Send-Q 高通常说明对端接收慢、网络拥塞、发送窗口受限或本端发得太快。对 listen socket,Recv-Q/Send-Q 的含义会和连接队列相关,所以分析时要先看连接状态,再结合进程读写、TCP 窗口、丢包重传和业务负载判断。
Recv-Q 和 Send-Q 的解释依赖 socket 状态。已建立连接主要看数据收发队列;监听 socket 则更接近连接队列和 backlog 相关状态,不能混为一谈。
对 established 连接,Recv-Q 表示内核接收缓冲区里已经收到、但应用还没读取的数据。它持续升高通常意味着应用消费慢、事件循环卡住或读逻辑阻塞。
Send-Q 表示本端发送缓冲区中尚未完成发送或确认的数据。它持续升高常见于对端处理慢、对端接收窗口变小、网络拥塞、丢包重传或本端写入过快。
排查时要一起看进程 CPU、线程栈、应用日志、socket 状态、重传、窗口大小、网卡丢包和对端负载。只看 netstat 的一个数字容易误判。
接收队列满时对端发送会被 TCP 流控影响;发送队列满时本端阻塞写可能卡住,非阻塞写会返回 EAGAIN,应用需要等待可写事件再继续发送。
先定位对应进程和连接,检查应用是否及时读 socket、线程是否阻塞、CPU 是否打满、事件循环是否卡住,再看接收缓冲和对端发送情况。
不一定。可能是对端不读、对端窗口小、网络拥塞或丢包,也可能是本端写入速率超过实际发送能力。
通常返回 EAGAIN 或 EWOULDBLOCK,应用应注册可写事件,等内核发送队列腾出空间后继续写。