查看阿里云云服务器(ECS)的当前连接数,其实不能只盯着一个地方看。因为“连接数”这个概念在操作系统内核、应用层和网络层面是有区别的。
作为运维或开发,通常我们需要从三个维度来排查和监控:
- 系统级 TCP 连接总数(最直观,反映负载压力)。
- 特定端口/服务的活跃连接(比如 Nginx、MySQL 或 Java 应用的连接数)。
- 云监控 CES 的历史趋势与实时告警(用于长期观察)。
下面我按实操性从高到低,给你梳理几种最常用的方法。
一、 最直接的方法:SSH 登录服务器查看(实时数据)
如果你需要知道此时此刻服务器的 TCP 连接状况,命令行是最准确的。
1. 查看所有 TCP 连接的总数
这是判断服务器是否被 DDoS 攻击或资源耗尽的第一手资料。
netstat -an | grep tcp | wc -l
或者更简洁的方式(推荐):
ss -s
ss -s 会直接输出类似这样的信息:
Total: 1500 (kernel 1600)
TCP: 1480 (estab 120, closed 900, orphaned 0, synrecv 0, timewait 900/0), ports 0
Transport Total IP IPv6
* 1600 - -
RAW 0 0 0
UDP 20 10 10
TCP 1480 740 740
INET 1500 750 750
FRAG 0 0 0
重点关注 estab(established,已建立连接)的数量。如果这个数字异常高(比如几万甚至几十万),说明可能有异常流量或连接泄漏。
2. 查看某个端口的连接数(如 Web 服务 80/443)
假设你的 Nginx 或 Tomcat 跑在 80 端口:
# 统计 80 端口的 ESTABLISHED 状态连接数
netstat -an | grep :80 | grep ESTAB | wc -l
3. 查看连接详情(定位问题源 IP)
如果连接数爆满,你需要知道是谁连进来的:
# 按 IP 分组统计连接数,并排序
netstat -an | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 10
这能帮你快速发现是否有某个 IP 在进行高频请求或攻击。
二、 通过阿里云控制台(CES 云监控)查看
如果你没有服务器权限,或者想长期监控,使用阿里云自带的 云监控服务(Cloud Monitor) 是标准做法。
1. 基础监控指标
登录阿里云控制台 -> 云监控 -> 主机监控 -> 找到你的 ECS 实例。
默认提供的关键指标包括:
- TCP 连接数:注意区分
TcpActiveOpens(主动发起)、TcpPassiveOpens(被动接受)和TcpEstabResets等。 - 网络流入/流出带宽:间接判断是否有大流量连接。
注意:阿里云基础监控的数据采集频率通常是 1分钟一次。对于秒级的突发连接数波动,它可能不够灵敏,但足以看出趋势。
2. 自定义监控(高级用法)
如果你的业务对连接数极其敏感(比如XX交易、即时通讯),建议编写一个简单的脚本,定期将连接数上报到阿里云的 自定义监控(Custom Metrics)。
思路:
- 在服务器上写个 Shell/Python 脚本,每分钟执行一次
ss -s解析出estab数值。 - 调用阿里云 OpenAPI 的
PutMetricData接口,将数据推送到 CES。 - 在 CES 控制台设置针对该自定义指标的告警规则(例如:当连接数 > 5000 时触发钉钉/短信告警)。
这样你可以获得更细粒度、更贴合业务逻辑的连接数监控。
三、 应用层视角(Nginx / MySQL / Java)
有时候系统层面的连接数不高,但应用层已经卡死了。这时候要看具体中间件。
1. Nginx
- 配置开启访问日志:确保
access_log格式中包含$status和$connection等信息。 - Stub_status 模块:在 Nginx 配置中添加 location,暴露当前活跃连接数、总连接数等。
location /nginx_status { stub_status on; allow 127.0.0.1; # 仅允许本地查看 deny all; }访问
/nginx_status可以看到:Active connections: 120 server accepts handled requests 1000 1000 2000 Reading: 0 Writing: 3 Waiting: 117这里的
Active connections就是 Nginx 当前的活跃连接数。
2. MySQL
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
Threads_connected 是当前建立的线程数,通常等于连接数。
3. Java (Tomcat/Spring Boot)
- 如果使用 Spring Boot Actuator,可以暴露
/actuator/metrics/jvm.threads.states等指标。 - 如果是原生 Tomcat,可以通过 JMX 或日志分析获取。
四、 避坑指南 & 最佳实践
- 不要只看
netstat:netstat命令本身比较慢,在高并发场景下(如数万连接),执行netstat -an可能会消耗大量 CPU,反而加剧服务器负担。推荐使用ss命令,它是 Linux 内核直接读取 socket 表,速度极快。 - 区分 TIME_WAIT 和 ESTABLISHED:
ESTABLISHED:正在通信的有效连接,代表真实负载。TIME_WAIT:连接关闭后等待回收的状态。如果TIME_WAIT数量极大(远超ESTABLISHED),可能是短连接频繁创建导致,需优化代码(如使用连接池、Keep-Alive)。
- 安全组与防火墙干扰:有时你看到连接数少,但实际请求进不来,可能是阿里云安全组或服务器内部
iptables/firewalld丢弃了数据包。此时连接数不会增加,但用户体验是断开的。 - 告警阈值设定:
- 一般 Web 服务器:单机连接数超过 1000~2000 就需要关注(取决于配置和优化)。
- 高性能网关:可能支持数万甚至十万级连接。
- 务必结合你的压测结果设定阈值,而不是拍脑袋决定。
总结
- 快速诊断:用 SSH 登录,执行
ss -s和ss -tnp state established '( dport = :80 or sport = :80 )'。 - 日常监控:依赖阿里云控制台的主机监控(基础指标)。
- 精准告警:编写脚本通过 OpenAPI 上报自定义指标到 CES,并设置告警规则。
- 应用层:检查 Nginx
stub_status或数据库Threads_connected。
希望这些方法能帮你准确定位连接数问题。如果有具体的报错现象或性能瓶颈,可以提供更多细节,我再针对性分析。
云技术博客