Linux 端口连接堆积怎么查:ss 的 SYN-RECV、TIME-WAIT 与监听队列
线上服务出现偶发连接超时的时候,先别急着把锅全甩给带宽,也别上来就把所有TCP参数往大了调。Linux里 LISTEN、SYN-RECV、TIME-WAIT 都看起来像“连接数很多”,但它们对应的TCP阶段完全不一样:有的是应用正在等待接收请求,有的是三次握手还没走完,有的是连接已经关闭、正等着系统回收资源。先用 ss 把不同连接状态拆开统计,再看监听队列和应用的 accept 速度,调参才不会漏掉真正拖慢服务的慢消费者。
ss -lnt的监听行里,Recv-Q更接近当前已经完成握手的待消费连接队列长度,Send-Q就是当前监听队列的最大上限。SYN-RECV持续增长说明半连接请求出现积压,TIME-WAIT数量偏高大多是短连接关闭后的资源回收压力。somaxconn与tcp_max_syn_backlog分别约束已完成连接和半连接请求的容量,最终实际生效的上限还会受应用自身配置的 backlog 影响。- 只有明确确认队列已经溢出之后,才去调大对应参数;调整完必须复查
ss、内核统计计数和业务侧的连接成功率。

先用 ss 判断连接到底堵在哪一段
假设业务服务监听的端口是 8080,先跑命令保留一份纯数字化、不会触发额外DNS解析的现场快照:
sudo ss -lnt sport = :8080 sudo ss -ant state syn-recv sport = :8080 sudo ss -ant state time-wait dport = :8080
第一条命令看监听套接字的队列占用情况,第二条统计还停留在半连接阶段的请求,第三条观察已经走完关闭流程但还没释放的连接。不要只执行一次就下判断,连续采样10秒左右拿到的波动数据参考价值更高:
for i in 1 2 3 4 5; do date '+%T' ss -lnt sport = :8080 ss -ant state syn-recv sport = :8080 | tail -n +2 | wc -l ss -ant state time-wait dport = :8080 | tail -n +2 | wc -l sleep 2 done
如果监听行的 Recv-Q 持续接近 Send-Q,同时 SYN-RECV 数值还在快速上涨,优先怀疑是应用来不及接收新连接,或者刚好遇上突发流量打满了队列。要是 TIME-WAIT 数量很高但监听队列占用一直稳定,排查方向就该转向短连接占比、客户端连接复用策略和连接关闭的节奏,不用上来就改系统的 backlog 参数。
LISTEN 行的两列数字分别说明什么
监听套接字的 ss 输出大概长这样:
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 384 4096 0.0.0.0:8080 0.0.0.0:*
这里的 Recv-Q 可以直接理解为内核已经帮你完成三次握手、等着应用进程取走的已完成连接数量,Send-Q 是当前这个监听端口的队列最大上限。它既不是网卡的收发字节统计,也不是服务上已经建立好的全部TCP连接总数。如果应用的业务线程卡在数据库查询、锁等待或者启动慢初始化逻辑上,连接就会全都堆在内核队列里;单纯把队列上限从4096改成8192,只会延后连接被拒绝或者超时的时间,根本解决不了应用消费慢的根因。
| 现场现象 | 优先核对的证据 | 第一步操作 |
|---|---|---|
| LISTEN 状态的 Recv-Q 数值接近 Send-Q | ss -lnt、accept 调用延迟 | 检查消费线程状态、锁等待情况和突发流量特征 |
| SYN-RECV 数量短时快速上涨 | ss state syn-recv、内核协议栈计数 | 区分是正常握手未完成、合法流量突增还是异常攻击流量 |
| TIME-WAIT 数量高但监听队列稳定 | ss state time-wait、连接复用率 | 优化长连接保活配置和连接的生命周期管理 |
SYN-RECV 和 TIME-WAIT 不是同一种“连接太多”
SYN-RECV 表示本机已经回复了SYN包,还在等待对端回包完成三次握手。它占用的是半连接请求的存储槽位;大量出现的时候,可能是对端到本机的网络有丢包,也可能是服务处理速度跟不上新连接的速度。内核文档里把 tcp_max_syn_backlog 定义为每个监听器能够留存的 SYN-RECV 请求最大数量,所以它和全局配置的 somaxconn 不是同一个调节参数。
TIME-WAIT 出现在连接主动关闭之后,作用是避免旧连接的遗留报文影响后续新建立的同名连接。它本身完全不等同于监听队列溢出。先排查清楚是哪一端在主动关闭连接、客户端是不是每次发请求都新建一个TCP连接,再决定要不要调整连接池配置或者长连接保活策略。
sudo nstat -az | rg 'Listen|Syncookie|TCPAbort|TW' sudo ss -tan state time-wait '( sport = :8080 or dport = :8080 )' | head -20
内核统计的计数器名称会随内核版本和工具版本略有差异,命令输出要以当前本机实际显示的字段为准。重点要观察参数调整前后,是否还有 listen overflow、SYN cookie 生成或者异常终止这类计数持续增长,不要只盯着某一个瞬时的连接总数做判断。
调参前同时核对 somaxconn、syn backlog 和应用 backlog
确认真的出现了队列溢出之后,先把系统当前的参数值记录下来:
sysctl net.core.somaxconn sysctl net.ipv4.tcp_max_syn_backlog sudo ss -lnt sport = :8080
这几个内核参数的值,要和应用程序自身的监听配置放在一起校验。应用代码里调用 listen(fd, backlog) 函数时传入的 backlog 数值可能本身就设得很小;哪怕你把内核参数调得再大,应用也不会自动用上更大的队列上限。更稳妥的调整顺序是:先把应用实际接收连接的能力提上去,再给应用配置一个合理的backlog数值,最后在确实有明确证据的情况下再调整内核的队列上限参数。
临时验证的时候可以只挑一台灰度实例做调整,同步记录连接成功率、P99建连耗时、Recv-Q/Send-Q 比值和应用的accept调用速率。不要把所有线上机器同时改参数,不然你根本分不清问题来自流量波动还是参数改动。

syncookies 只能做握手保护,不能替代合法流量的容量规划
Linux 的 syncookies 功能本来是用来在 SYN backlog 被打满的时候,缓解常见的SYN洪水攻击的,但内核文档也明确提示:如果你的告警来自合法业务的高并发流量,那还是要继续检查 tcp_max_syn_backlog、somaxconn、tcp_abort_on_overflow 和应用的实际吞吐能力,别把 syncookies 当成能无限扩容的开关。开启它之后可能会让部分TCP扩展特性失效,还会直接掩盖掉应用accept太慢的真实问题。
生产环境做这类配置变更,至少要提前准备好回滚方案:
sudo sysctl -w net.core.somaxconn=4096 sudo sysctl -w net.ipv4.tcp_max_syn_backlog=4096 # 压测或灰度完成后,按变更记录恢复原值
如果需要把配置持久化留存,应该把参数写入经过运维管控的sysctl配置文件,走正式的发布流程审核,不要只在故障处理现场手工敲命令临时生效。全部配置做完之后,重新发起测试连接,确认监听队列占用回落、业务侧的连接成功率恢复正常。
常见问题
TIME-WAIT 数量很多,需要马上调大 tcp_max_tw_buckets 吗?
通常不需要。先确认是不是短连接比例太高、主动关闭连接的方向不合理或者连接复用率太低;只调大上限反而会掩盖连接生命周期管理不合理的潜在问题。
把 somaxconn 调大后,SYN-RECV 数量还在涨是什么原因?
somaxconn 主要影响的是已完成连接的监听队列上限,SYN-RECV 数量增长还要看 tcp_max_syn_backlog 配置、网络侧握手完成率、链路丢包情况和应用本身的accept处理速度。
ss 的 Send-Q 是网络发送缓冲区吗?
只有在已经建立连接状态的输出行里,Send-Q 才代表网络发送队列的含义;如果是在 LISTEN 状态的行里,它表示的是监听队列的最大上限。判断含义之前一定要先看清楚当前这个socket的状态。
连接超时就一定是监听队列溢出吗?
不一定。DNS解析、路由转发、防火墙规则、TLS握手开销、应用内部逻辑处理慢和上游服务的连接池耗尽都可能造成建连超时。监听队列相关的证据,只是整个故障排查链路里的其中一段。
把连接堆积排查固化成四步
遇到业务报连接超时的时候,先用 ss 分不同TCP状态做多轮采样,再把LISTEN行的两列数值和应用的accept调用速率做对应分析;只有明确确认队列已经触达上限之后,再分别核对 somaxconn、tcp_max_syn_backlog 与应用自身的backlog配置。调参之后再用连接成功率、建连延迟、内核统计计数和队列回落情况做多维度复查。这样得到的是完整的证据链,而不是一组碰运气试出来的sysctl参数值。
Go 1.27 默认启用 stdversion:go.mod 版本边界与 CI 告警怎么处理
- 上一篇
- Go 1.27 默认启用 stdversion:go.mod 版本边界与 CI 告警怎么处理
- 下一篇
- Redis 8.4 消费组怎么接管空闲消息:XREADGROUP CLAIM 与重试边界
-
- 文章 · linux | 2小时前 | oom · 内存 · Linux · 运维排查 · cgroup · Linux OOM cgroup v2 memory.events memory.current memory.max memory.high
- Linux cgroup v2 memory.events 怎么看:区分回收、限额与 OOM 的证据链
- 456浏览 收藏
-
- 文章 · linux | 2小时前 | Linux · 性能监控 · 系统排查 · 资源压力 · Linux 性能排查 PSI Pressure Stall Information /proc/pressure
- Linux PSI 怎么定位 CPU、内存和 IO 压力:/proc/pressure 与阈值告警实战
- 461浏览 收藏
-
- 文章 · linux | 3小时前 | Linux · 运维排查 · 进程管理 · 服务限时 · Linux 服务治理 journalctl RuntimeMaxSec
- Linux RuntimeMaxSec 到点后为什么没退出:服务属性与日志验证
- 389浏览 收藏
-
- 文章 · linux | 3小时前 | Linux · 运维排查 · 进程管理 · 服务限时 · Linux 服务治理 journalctl RuntimeMaxSec
- Linux 服务超过 RuntimeMaxSec 怎么验收:运行时限、日志结果与重启边界
- 474浏览 收藏
-
- 文章 · linux | 4小时前 | Linux · 网络排障 · Netfilter · Linux conntrack nf_conntrack_max
- Linux conntrack 表满怎么排查:nf_conntrack_count 与 max 的安全处理
- 129浏览 收藏
-
- 文章 · linux | 5小时前 | Linux · 故障排查 · 服务隔离 · Linux 临时文件 PrivateTmp /tmp mount namespace
- Linux PrivateTmp 开启后 /tmp 文件去哪了:服务命名空间与排查边界
- 254浏览 收藏
-
- 文章 · linux | 9小时前 | Linux · 运维 · 服务配置 · 进程资源 · ulimit LimitNOFILE Linux 服务配置 进程限制
- Linux LimitNOFILE 改了仍是 1024:unit 覆盖与新 PID 校验
- 179浏览 收藏
-
- 文章 · linux | 9小时前 | Linux · 运维 · 服务配置 · 进程资源 · ulimit LimitNOFILE Linux 服务配置 进程限制
- Linux 服务 LimitNOFILE 配置不生效怎么办:覆盖配置与新 PID 验收
- 185浏览 收藏
-
- 文章 · linux | 10小时前 | 定时任务 · Linux · 运维 · crontab · 日志核验 · Linux 定时任务 crontab journalctl OnCalendar Persistent
- Linux 日历定时任务怎么补跑:OnCalendar、Persistent 与 journalctl 实战
- 120浏览 收藏
-
- 文章 · linux | 10小时前 | 定时任务 · Linux · 运维 · crontab · 服务定时器 · Linux crontab 服务定时器 OnCalendar Persistent
- Linux 服务定时器替代 crontab:日历触发、错过补跑与日志核验
- 237浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4901次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4476次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4420次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4657次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4615次使用
-
- Go语言TCP从原理到代码实现详解
- 2022-12-30 488浏览
-
- Go语言实现UDP协议及TCP通讯
- 2023-01-01 398浏览
-
- go zero微服务实战性能优化极致秒杀
- 2022-12-27 207浏览
-
- 详解golang执行Linuxshell命令完整场景下的使用方法
- 2023-01-07 426浏览
-
- Golang通过包长协议处理TCP粘包的问题解决
- 2022-12-28 358浏览

