如何排查阿里云服务器TCP连接数突然增加的问题?

排查阿里云 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

分析判断:

  1. 如果是已知业务 IP:检查是否近期有促销活动、爬虫抓取或业务高峰。
  2. 如果是陌生/恶意 IP:可能是 CC 攻击、端口扫描或暴力破解。此时应立即在阿里云控制台启用 安全组 限制或 云盾 WAF/DDoS 防护。
  3. 如果是大量不同 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 数量是否异常膨胀,是否有协程泄漏。
  • 通用:检查应用日志中是否有大量异常抛出导致连接未能正常关闭。

第五步:系统与内核参数检查

有时连接数增加并非业务问题,而是系统资源瓶颈导致的“假性”堆积。

  1. 文件描述符限制:

    ulimit -n
    cat /proc/sys/fs/file-max

    如果当前打开文件数接近上限,新连接将无法建立,旧连接可能因无法分配 FD 而堆积。

  2. TCP 内核参数:

    sysctl net.ipv4.tcp_max_syn_backlog
    sysctl net.ipv4.tcp_tw_reuse
    sysctl net.core.somaxconn
    • tcp_max_syn_backlog:SYN 队列长度。如果过小,在高并发下容易丢包。
    • somaxconn:监听套接字 backlog 长度。如果应用设置的 backlog 大于此值,会被截断,导致连接拒绝或延迟。
  3. 内存与 CPU:
    使用 top 或 htop 检查是否有进程占用过高 CPU 或内存,导致系统调度缓慢,连接处理不及时。

第六步:利用阿里云工具辅助诊断

  1. 云监控(CloudMonitor):

    • 查看 ECS 实例的 网络流入/流出带宽 和 Packets In/Out。如果带宽不高但连接数高,可能是小数据包高频交互(如心跳、RPC)。
    • 查看 CPU 使用率 和 磁盘 I/O,排除资源瓶颈。
  2. VPC 流日志(Flow Logs):

    • 在 VPC 控制台开启流日志,可以记录经过 ENI 的所有网络流信息。这对于排查跨可用区、跨 VPC 或隐藏的内部流量非常有效,尤其是当 SSH 登录无法直接看到某些底层通信时。
  3. SLS 日志服务:

    • 如果应用已接入 SLS,通过 SQL 分析应用日志中的错误码、响应时间、连接创建/销毁事件。

总结与建议

  • 如果是攻击:优先在阿里云控制台启用 DDoS 基础防护 或 WAF,并通过 安全组 封禁恶意 IP。
  • 如果是代码 Bug:重点排查 CLOSE_WAIT 状态,检查应用是否正确关闭 socket,特别是异步回调、定时任务和网络重试逻辑。
  • 如果是配置问题:调整内核参数(如 tcp_tw_reuse, somaxconn),优化连接池大小,确保与应用负载匹配。
  • 如果是业务高峰:考虑扩容 ECS 实例规格,或使用 SLB(负载均衡) 分散流量,避免单点过载。

排查过程中,务必保持冷静,先复现、再定位、后解决。对于生产环境,建议在低峰期进行变更,并准备好回滚方案。

未经允许不得转载:CLOUD云枢 » 如何排查阿里云服务器TCP连接数突然增加的问题?