排查阿里云 ECS 服务器 TCP 连接数突增,核心思路是“由外而内、由宏观到微观”。我们需要先确认这是否是真实的业务流量增长,还是异常连接(如攻击、僵尸进程或配置错误)。
以下是标准化的排查步骤和命令:
第一步:确认现象与基准线
首先,登录 ECS 实例,使用 ss 或 netstat 查看当前的连接状态分布。推荐使用 ss,性能优于 netstat。
# 统计所有 TCP 连接的各状态数量
ss -s
# 或者按状态分类查看具体连接数
ss -tan | awk '{print $1}' | sort | uniq -c | sort -nr
重点关注以下状态:
- ESTABLISHED:正常建立的连接。如果此数值极大且持续高位,需进一步分析来源 IP。
- TIME_WAIT / CLOSE_WAIT:
- TIME_WAIT 过多通常是因为服务端主动关闭连接频繁,且客户端未复用连接。这是高并发短连接场景下的常见现象,可通过调整内核参数优化,但不一定是故障。
- CLOSE_WAIT 过多是严重警告信号。这意味着对端已关闭连接,但本机应用层没有调用
close()释放 socket。这通常指向代码 bug(资源泄漏)或防火墙/NAT 设备截断连接导致的应用层无感知。
第二步:定位连接源头(Source IP Analysis)
如果 ESTABLISHED 连接数异常高,需要找出是谁在连接你。
# 查看建立连接最多的前 10 个源 IP
ss -tan state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 10
分析判断:
- 如果是已知业务 IP:检查是否近期有促销活动、爬虫抓取或业务高峰。
- 如果是陌生/恶意 IP:可能是 CC 攻击、端口扫描或暴力破解。此时应立即在阿里云控制台启用 安全组 限制或 云盾 WAF/DDoS 防护。
- 如果是大量不同 IP 的随机连接:极大概率是 DDoS 或 SYN Flood 攻击。
第三步:定位本地监听服务(Destination Port Analysis)
确定是哪类服务承载了这些连接。
# 查看哪些端口建立了最多的连接
ss -tan | awk 'NR>1 {print $4}' | rev | cut -d: -f1 | rev | sort | uniq -c | sort -nr | head -n 10
结合 ps 或 lsof 找到对应进程:
# 假设发现 80 端口连接最多,查看占用该端口的进程
lsof -i :80 | head -n 20
# 或者
ss -lnp | grep ':80'
第四步:深入应用层排查
情况 A:Web 服务(Nginx/Apache/Tomcat)
- Nginx:检查 access.log,看是否有特定 URI 被高频访问。检查
worker_connections是否达到上限。 - Tomcat/Jetty:检查线程池配置。如果线程池耗尽,新请求会排队,表现为连接堆积。
- 代码层面:是否存在长轮询(Long Polling)、WebSocket 未正确断开、或 HTTP Keep-Alive 超时时间设置不合理。
情况 B:数据库连接(MySQL/Redis)
- MySQL:
SHOW PROCESSLIST; -- 或 SELECT * FROM information_schema.processlist WHERE COMMAND != 'Sleep' ORDER BY TIME DESC LIMIT 10;检查是否有慢查询、锁等待或未释放的连接。
- Redis:检查
info clients,注意connected_clients和blocked_clients。Redis 默认单线程处理命令,大量阻塞操作会导致连接堆积。
情况 C:自定义 Java/Go/Python 服务
- Java:使用
jstack <pid>查看线程堆栈,是否有大量线程处于WAITING或BLOCKED状态。检查连接池(HikariCP, Druid)的配置和实际使用率。 - Go:检查 goroutine 数量是否异常膨胀,是否有协程泄漏。
- 通用:检查应用日志中是否有大量异常抛出导致连接未能正常关闭。
第五步:系统与内核参数检查
有时连接数增加并非业务问题,而是系统资源瓶颈导致的“假性”堆积。
-
文件描述符限制:
ulimit -n cat /proc/sys/fs/file-max如果当前打开文件数接近上限,新连接将无法建立,旧连接可能因无法分配 FD 而堆积。
-
TCP 内核参数:
sysctl net.ipv4.tcp_max_syn_backlog sysctl net.ipv4.tcp_tw_reuse sysctl net.core.somaxconntcp_max_syn_backlog:SYN 队列长度。如果过小,在高并发下容易丢包。somaxconn:监听套接字 backlog 长度。如果应用设置的 backlog 大于此值,会被截断,导致连接拒绝或延迟。
-
内存与 CPU:
使用top或htop检查是否有进程占用过高 CPU 或内存,导致系统调度缓慢,连接处理不及时。
第六步:利用阿里云工具辅助诊断
-
云监控(CloudMonitor):
- 查看 ECS 实例的 网络流入/流出带宽 和 Packets In/Out。如果带宽不高但连接数高,可能是小数据包高频交互(如心跳、RPC)。
- 查看 CPU 使用率 和 磁盘 I/O,排除资源瓶颈。
-
VPC 流日志(Flow Logs):
- 在 VPC 控制台开启流日志,可以记录经过 ENI 的所有网络流信息。这对于排查跨可用区、跨 VPC 或隐藏的内部流量非常有效,尤其是当 SSH 登录无法直接看到某些底层通信时。
-
SLS 日志服务:
- 如果应用已接入 SLS,通过 SQL 分析应用日志中的错误码、响应时间、连接创建/销毁事件。
总结与建议
- 如果是攻击:优先在阿里云控制台启用 DDoS 基础防护 或 WAF,并通过 安全组 封禁恶意 IP。
- 如果是代码 Bug:重点排查 CLOSE_WAIT 状态,检查应用是否正确关闭 socket,特别是异步回调、定时任务和网络重试逻辑。
- 如果是配置问题:调整内核参数(如
tcp_tw_reuse,somaxconn),优化连接池大小,确保与应用负载匹配。 - 如果是业务高峰:考虑扩容 ECS 实例规格,或使用 SLB(负载均衡) 分散流量,避免单点过载。
排查过程中,务必保持冷静,先复现、再定位、后解决。对于生产环境,建议在低峰期进行变更,并准备好回滚方案。
CLOUD云枢