Linux TCP 协议栈中发送队列(Send-Q)溢出排查

浅辰小哥_2257

浅辰小哥_2257

2026-07-12

446人浏览

原创

Linux TCP发送队列(Send-Q)溢出本质是套接字发送缓冲区满,导致send/write阻塞或返回EAGAIN;它属传输层缓冲问题,需从应用吞吐、对端接收能力及网络路径协同排查,区别于SYN/accept队列溢出。

linux tcp 协议栈中发送队列(send-q)溢出排查

Linux TCP 发送队列(Send-Q)溢出,本质是套接字的 发送缓冲区已满,导致内核无法继续缓存待发数据,应用调用 send() 或 write() 可能阻塞或返回 EAGAIN/EWOULDBLOCK。它不同于半连接队列(SYN Queue)或全连接队列(Accept Queue)溢出,属于传输层缓冲行为,需从应用吞吐、对端接收能力和网络路径三方面定位。

确认 Send-Q 是否真实堆积

Send-Q 值在 ss -an 或 netstat -an 输出中仅对 非 LISTEN 状态连接 有效,含义是“已发出但尚未被对端 ACK 确认的数据字节数”。持续高位(如 >100KB)且不回落,才提示潜在问题:

  • 运行 ss -tni 'sport == :80' | awk '$2 > 100000 {print $0}' 筛选 Send-Q 超 100KB 的 ESTABLISHED 连接
  • 对比同一连接的 rtt 和 rttvar:若 RTT 显著增大(如 >500ms)、RTT 方差飙升,说明对端接收慢或网络丢包,导致窗口停滞、重传堆积
  • 检查对端是否异常:如客户端崩溃、防火墙拦截 ACK、中间设备限速,都会造成发送端缓冲区持续积压

排查内核级 TCP 发送缓冲区丢包

Send-Q 溢出的最终表现是内核主动丢弃新数据包,指标为 tcpRcvQDrop(注意不是 packet receive errors):

Linux Security Scanner
Linux Security Scanner

Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...

下载
  • 执行 grep Tcp /proc/net/snmp | awk '{print $19}' 获取 tcpRcvQDrop 计数;该值非零且持续增长,说明 socket 接收队列满导致丢包——但这反映的是本端接收队列满,间接影响对端 Send-Q;真正对应本端发送丢包的是 Tcp: InCwndFull(拥塞窗口满)或驱动层 drop,需结合 /proc/net/dev 中对应网卡的 drop 字段交叉验证
  • 若 ss -i 显示某连接 cwnd 长期为 1 MSS 且 ssthresh 极低,大概率触发了拥塞控制降窗,发送速率被压制,缓冲区易堆积

检查应用层写入行为与 socket 配置

Send-Q 高往往源于应用未及时感知对端窗口关闭,或自身写入节奏失控:

  • 确认 socket 是否启用 TCP_NODELAY:若业务为小包高频交互(如 RPC),禁用 Nagle 算法可减少缓冲等待,避免小包攒批加重 Send-Q 压力
  • 检查应用是否忽略 send() 返回值:当返回值 时,必须循环调用直到写完,否则残留数据滞留在内核缓冲区
  • 观察 SO_SNDBUF 设置:默认值通常 128KB~256KB,若业务需突发大块数据(如文件上传),可适当调大(setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &val, sizeof(val))),但需同步调整 net.ipv4.tcp_wmem

关联网络路径与对端状态

单看本机 Send-Q 无法闭环定位,必须协同分析链路两端:

  • 用 tcptrace 或 Wireshark 抓包,重点观察:是否有大量重复 ACK(对端丢包)、窗口字段是否长期为 0(对端接收缓冲区满)、是否存在持续重传(超时未 ACK)
  • 检查对端主机:ss -tni 看其 Recv-Q 是否持续 >0,cat /proc/net/snmp | grep Tcp: 查 tcpRcvQDrop 是否增长——若对端接收队列满,本端 Send-Q 必然堆积
  • 排查中间设备:运营商 QoS、云厂商安全组限速、硬件负载均衡器缓冲区设置,都可能导致 ACK 延迟或丢弃,诱发本端发送停滞

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4430

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3713

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

3013

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

7450

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

7082

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

4033

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3525

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3779

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习