Linux下获取出口网卡实时吞吐需读取/proc/net/dev中对应网卡的tx_bytes字段(第10列),两次采样求差除以时间间隔并×8换算为bps;须先用ip route get 1.1.1.1动态确定出口网卡,避免硬编码,且采样间隔建议1秒,因内核更新频率约1Hz。

Linux 下用 /proc/net/dev 读取出口网卡实时吞吐,但要注意“出口”是相对的
Linux 没有直接标记“出口流量”的统计项,/proc/net/dev 中每行的 tx_bytes(第二列)才是你真正要的——它代表该网卡向外发送的字节数。别被“rx/tx”缩写迷惑:rx 是入,tx 是出,和本机视角一致。
实操建议:
- 先用
ip link show确认主出口网卡名(常见如eth0、ens33、wlan0),别硬写eth0 - 两次读取
/proc/net/dev中对应行的tx_bytes值,间隔 1 秒,差值除以 1000000 得到 Mbps 吞吐 - 注意单位:内核提供的是字节,不是比特;转换时 ×8 才是带宽,但多数监控场景更关心字节速率(如文件上传速度),按需选
- 避免每 100ms 采样——
/proc/net/dev更新频率约 1Hz,高频读取无意义,还可能触发内核警告
延迟波动不能靠 ping 实时计算,得用 libpcap 或 SO_TIMESTAMP 抓包测 RTT
ping 命令本身是诊断工具,不是测量接口。C++ 里调 system("ping -c 1 google.com") 解析输出,延迟抖动(Jitter)误差大、开销高、不可控——每次 fork + exec + 字符串解析,100ms 内难稳定执行。
更可行的路径:
立即学习“C++免费学习笔记(深入)”;
- 用
libpcap发送 ICMP Echo Request 并监听 reply,记录 send timestamp 和 recv timestamp(需启用PCAP_TSTAMP_PRECISION_NANO) - 或用原始 socket +
SO_TIMESTAMP选项,收包时内核附带真实接收时间戳,比用户态clock_gettime()准确至少一个数量级 - 波动 = 连续 RTT 的标准差,至少积累 10+ 样本才具参考性;单次 ping 的 “min/avg/max/mdev” 是历史聚合,不是当前波动
- 别对同一目标高频发包(>10Hz)——可能被防火墙限速或丢包,反而污染数据
Windows 上没 /proc,得用 GetIfEntry2() + GetPerfCounterData() 组合查出口带宽
Windows 不暴露裸设备计数器,GetIfEntry2() 只给累计字节数(ifOutOctets),但更新延迟不稳定(常为 5–30 秒),不适合秒级实时统计。
实操要点:
- 优先走 Windows Performance Counter:查询
"Network Interface(*)\Bytes Sent/sec"计数器,它由 ndis.sys 实时更新,精度 ≈ 1s - 用
PdhOpenQuery()+PdhAddEnglishCounter()注册,再循环PdhCollectQueryData()+PdhGetFormattedCounterValue() - 注意:计数器名中的
(*)需替换为实际网卡实例名,从PdhEnumObjectItems()枚举获取,不能硬编码 - 若需更低延迟(如 200ms 级),只能投向 NDIS Miniport Driver 或 ETW 事件流——这已超出用户态 C++ 范围,需驱动配合
延迟 + 吞吐 + 波动三者无法靠单一 API 获取,必须分层采集再对齐时间戳
吞吐来自内核计数器(毫秒级更新),延迟来自网络往返(受路由、队列、ACK 延迟影响),二者天然不同步。强行用同一时间点拼凑“实时报告”,会误导判断。
关键处理逻辑:
- 每个指标单独采集线程(或异步循环),各自打上
clock_gettime(CLOCK_MONOTONIC, &ts)时间戳 - 汇总时按时间窗口对齐(例如 1s 窗口内所有延迟样本 + 吞吐增量),而非“此刻的吞吐 + 此刻 ping 的延迟”
- 波动计算必须基于同一批延迟样本,不能拿前 5 秒的 ping 结果和后 5 秒的吞吐混算
- 如果要做“实时报告”,输出格式应明确标注各字段的时间范围,比如:
{"throughput_mbps": 12.4, "window_start_ns": 1712345678901234567, "rtt_jitter_ms": 8.2, "rtt_samples": [24, 26, 22, 31]}
跨平台统一采集最难的不是代码,而是定义清楚“实时”指什么——是采集延迟,还是呈现延迟,还是决策延迟。这个边界不划清,后面所有统计都会漂移。


















