在华为云上监控网络上行速率,核心逻辑其实分两层:一层是云平台侧(你作为用户能看到的基础指标),另一层是实例内部(你自己部署Agent或脚本看到的精确流量)。
大多数时候,大家问这个问题是因为发现云主机跑不满带宽,或者想排查业务瓶颈。下面我把这两种场景的操作路径和坑点拆开说清楚。
一、 云平台侧:基础监控(无需安装任何东西)
这是最直接的,利用华为云云监控服务(CES)。但要注意,默认开启的监控项通常只包含“公网流入/流出”或“内网流量”,且粒度较粗。
- 进入控制台:
登录华为云管理控制台,搜索并进入“云监控服务”。 - 查找实例:
在左侧导航栏选择“主机监控” -> “弹性云服务器”,找到你的目标ECS实例。 - 查看指标:
点击“监控指标”页签。这里需要仔细甄别指标名称:NetworkIn/NetworkOut:这是网卡级别的总流量。如果你绑定的是EIP(弹性公网IP),这里的NetworkOut通常对应上行流量。- 注意单位:华为云默认显示的单位可能是 Bytes/s 或 bps,换算时要小心。1 Byte = 8 bits。
- 时间粒度:默认可能是5分钟一个点。对于突发流量,这个粒度太粗了,根本看不出瞬间峰值。
缺点:
- 只能看到聚合后的流量,无法区分是哪个进程产生的上行。
- 如果是通过NAT网关绑定的EIP,监控数据可能来自NAT网关而非ECS本身,延迟和准确性会有差异。
- 历史数据保留时间短,不适合做长期的带宽趋势分析。
二、 实例内部:精准监控(推荐方案)
如果你需要知道具体哪个端口、哪个进程在上行占用了带宽,或者需要秒级监控,必须在操作系统内部动手脚。
方案 A:使用 Prometheus + Node Exporter(运维标配)
这是目前互联网行业最通用的做法。在ECS内部安装 node_exporter,它会自动采集Linux内核的网络接口统计信息。
-
安装 node_exporter:
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz tar xvfz node_exporter-1.6.0.linux-amd64.tar.gz cd node_exporter-1.6.0.linux-amd64/ ./node_exporter & -
关键指标解读:
访问http://<ECS_IP>:9100/metrics,重点关注以node_network_transmit_bytes_total开头的指标。node_network_transmit_bytes_total{device="eth0"}:表示从 eth0 网卡发送出去的总字节数。- 计算上行速率:你需要用 Prometheus 的
rate()函数来计算每秒的增长率。rate(node_network_transmit_bytes_total{device="eth0"}[1m])这个结果就是当前1分钟内的平均上行速率(Bytes/sec)。
-
可视化:
将 Prometheus 接入 Grafana,创建一个 Dashboard,展示rate(...)的结果,就能实时看到上行曲线。
方案 B:轻量级脚本监控(适合不想装复杂组件的场景)
如果只是一台服务器,不想搞 Prometheus,可以用简单的 Shell 脚本配合 Crontab 或写入日志。
#!/bin/bash
# 获取当前时间戳
timestamp=$(date +%s)
# 指定网卡,通常是 eth0,请用 ip addr 确认
interface="eth0"
# 读取当前的 transmit bytes (第17列是tx bytes)
current_tx=$(cat /proc/net/dev | grep $interface | awk '{print $10}')
# 存储到文件,供下次计算差值
echo "$timestamp $current_tx" >> /var/log/network_uplink.log
然后在另一个脚本中计算差值:
# 读取上一行的 timestamp 和 tx 值
prev_line=$(tail -n 2 /var/log/network_uplink.log | head -n 1)
curr_line=$(tail -n 1 /var/log/network_uplink.log)
prev_ts=$(echo $prev_line | awk '{print $1}')
prev_tx=$(echo $prev_line | awk '{print $2}')
curr_ts=$(echo $curr_line | awk '{print $1}')
curr_tx=$(echo $curr_line | awk '{print $2}')
# 计算差值
time_diff=$((curr_ts - prev_ts))
if [ $time_diff -gt 0 ]; then
byte_diff=$((curr_tx - prev_tx))
# 转换为 Mbps: byte_diff * 8 / time_diff / 1000000
uplink_mbps=$(echo "scale=2; $byte_diff * 8 / $time_diff / 1000000" | bc)
echo "$(date) UpLink: ${uplink_mbps} Mbps"
fi
优点:简单粗暴,直接反映OS视角的真实发包量。
缺点:没有历史回溯能力,除非自己接数据库。
三、 常见坑与注意事项
-
网卡名称问题:
华为云的 ECS,新机型(如 Kunpeng 鲲鹏系列)网卡命名可能是eth0,老机型也可能是ensX或enpXsY。务必先用ip link show或ifconfig确认正确的网卡名。用错名字会导致监控为0。 -
TCP重传干扰:
如果你发现上行速率很高,但业务感觉卡顿,检查node_netstat_tcp_ReTransSegs。高上行不一定代表有效数据传输多,可能是大量重传导致的无效流量。 -
带宽限制 vs 实际流量:
华为云ECS的带宽是按“峰值带宽”购买的。如果你的上行速率一直达不到购买带宽的上限,不要急着扩容。先检查:- 应用层是否有限流?
- 客户端上传速度是否受限?
- 是否有安全组或ACL限制了出站流量?
-
NAT网关场景:
如果你的ECS没有绑定EIP,而是通过NAT网关共享带宽出公网,那么不要在ECS内部看流量,因为ECS内部看到的是内网流量。你应该去华为云控制台的“NAT网关”监控页面,查看“出方向流量”,那里才是真实的公网上行速率。
总结建议
- 快速看一眼:去华为云控制台 CES 看
NetworkOut,够用但不精确。 - 长期稳定监控:在ECS内部署
node_exporter+ Prometheus + Grafana,这是行业标准做法,能下钻到进程级别。 - NAT网关用户:别在ECS里折腾,直接看 NAT 网关的控制台监控。
选哪种方案,取决于你对“准确”的定义以及你能投入多少运维成本。
云技术博客