努力
加油

华为云上怎么监控网络的上行速率?

在华为云上监控网络上行速率,核心逻辑其实分两层:一层是云平台侧(你作为用户能看到的基础指标),另一层是实例内部(你自己部署Agent或脚本看到的精确流量)。

大多数时候,大家问这个问题是因为发现云主机跑不满带宽,或者想排查业务瓶颈。下面我把这两种场景的操作路径和坑点拆开说清楚。

一、 云平台侧:基础监控(无需安装任何东西)

这是最直接的,利用华为云云监控服务(CES)。但要注意,默认开启的监控项通常只包含“公网流入/流出”或“内网流量”,且粒度较粗。

  1. 进入控制台:
    登录华为云管理控制台,搜索并进入“云监控服务”。
  2. 查找实例:
    在左侧导航栏选择“主机监控” -> “弹性云服务器”,找到你的目标ECS实例。
  3. 查看指标:
    点击“监控指标”页签。这里需要仔细甄别指标名称:

    • 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内核的网络接口统计信息。

  1. 安装 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 &
  2. 关键指标解读:
    访问 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)。

  3. 可视化:
    将 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视角的真实发包量。
缺点:没有历史回溯能力,除非自己接数据库。

三、 常见坑与注意事项

  1. 网卡名称问题:
    华为云的 ECS,新机型(如 Kunpeng 鲲鹏系列)网卡命名可能是 eth0,老机型也可能是 ensX 或 enpXsY。务必先用 ip link show 或 ifconfig 确认正确的网卡名。用错名字会导致监控为0。

  2. TCP重传干扰:
    如果你发现上行速率很高,但业务感觉卡顿,检查 node_netstat_tcp_ReTransSegs。高上行不一定代表有效数据传输多,可能是大量重传导致的无效流量。

  3. 带宽限制 vs 实际流量:
    华为云ECS的带宽是按“峰值带宽”购买的。如果你的上行速率一直达不到购买带宽的上限,不要急着扩容。先检查:

    • 应用层是否有限流?
    • 客户端上传速度是否受限?
    • 是否有安全组或ACL限制了出站流量?
  4. NAT网关场景:
    如果你的ECS没有绑定EIP,而是通过NAT网关共享带宽出公网,那么不要在ECS内部看流量,因为ECS内部看到的是内网流量。你应该去华为云控制台的“NAT网关”监控页面,查看“出方向流量”,那里才是真实的公网上行速率。

总结建议

  • 快速看一眼:去华为云控制台 CES 看 NetworkOut,够用但不精确。
  • 长期稳定监控:在ECS内部署 node_exporter + Prometheus + Grafana,这是行业标准做法,能下钻到进程级别。
  • NAT网关用户:别在ECS里折腾,直接看 NAT 网关的控制台监控。

选哪种方案,取决于你对“准确”的定义以及你能投入多少运维成本。