当 ECS(Elastic Compute Service,如阿里云的云服务器)出现同时连接数过高但 CPU 使用率不高的情况时,这通常意味着系统正在处理大量的网络连接请求,但这些请求本身对计算资源的需求较低。这种现象在一些特定类型的业务场景中比较常见。
🔍 一、可能的原因分析
1. 高并发长连接服务
- 比如:WebSocket、MQTT、HTTP 长轮询等。
- 这些协议保持大量连接,但每个连接的数据传输量不大,CPU 不会很高。
2. 连接未及时释放
- 客户端没有正确关闭连接(例如未发送
FIN包),导致服务端保留了大量CLOSE_WAIT或TIME_WAIT状态的连接。 - 可能是客户端 bug 或配置不当。
3. DDoS 攻击或扫描行为
- 被动建立大量 TCP 连接,但攻击者不进行后续数据交互。
- 如 SYN Flood、TCP Scan 等。
4. 应用层设计问题
- 应用使用短连接频繁重连,而不是复用连接。
- 例如 HTTP 请求未启用 Keep-Alive,造成连接堆积。
5. 系统或内核限制不足
- 系统最大连接数限制(
ulimit -n)、文件描述符不够。 - 内核参数如
net.core.somaxconn、net.ipv4.ip_local_port_range设置不合理。
🛠️ 二、排查方法
1. 查看当前连接数和状态
# 查看总的连接数(包括监听、已建立、等待等)
ss -antp | wc -l
# 查看处于 CLOSE_WAIT 的连接数量
ss -antp | grep CLOSE-WAIT | wc -l
# 查看 TIME_WAIT 数量
ss -antp | grep TIME-WAIT | wc -l
2. 查看进程级别的连接情况
# 找出某个进程 PID 占用的连接数
PID=your_pid
lsof -p $PID | grep TCP | wc -l
3. 查看系统资源限制
ulimit -n # 当前用户打开文件数限制
cat /proc/sys/fs/file-max # 系统级最大文件句柄数
4. 检查系统日志
dmesg | grep -i tcp
journalctl -u your_service_name
5. 检查是否被攻击
使用 tcpdump 或第三方工具(如阿里云安全中心)查看是否有异常流量或 IP 频繁连接。
⚙️ 三、优化建议
1. 调整内核参数优化连接处理
修改 /etc/sysctl.conf:
net.core.somaxconn = 2048
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # 注意某些版本不推荐开启
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 1024 65535
fs.file-max = 1000000
执行生效:
sysctl -p
2. 增加文件句柄限制
修改 /etc/security/limits.conf:
* soft nofile 1048576
* hard nofile 1048576
并确保你的服务运行用户有对应权限。
3. 应用层优化
- 启用 HTTP Keep-Alive 减少连接创建。
- 使用连接池(如数据库连接池、Redis 连接池)。
- 客户端避免频繁断开重连。
4. 防火墙与限流
- 使用 iptables、fail2ban 限制单 IP 并发连接数。
- 配合 SLB + WAF 做前置防护。
📊 四、监控建议
可以使用以下工具进行持续监控:
| 工具 | 功能 |
|---|---|
ss, netstat |
查看连接状态 |
sar, mpstat |
查看 CPU 使用率 |
iftop, nload |
查看带宽使用 |
top, htop |
查看进程资源占用 |
| Prometheus + Node Exporter | 全面监控系统指标 |
✅ 五、总结
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 连接数高,CPU低 | 长连接服务、连接未释放、攻击、配置限制 | 调整内核参数、优化应用逻辑、加强防护、提升资源上限 |
如果你能提供更具体的环境信息(如操作系统、服务类型、连接类型、是否有负载均衡等),我可以给出更针对性的建议。
CLOUD技术博