基于Python构建以太网收发速度监控测量模块的技术咨询
基于psutil实现以太网收发速度监控的Python模块方案
嘿,你选psutil绝对是个好主意——它几乎是Python生态里做系统资源监控的标配,用来实现以太网收发速度测量完全没问题!我来给你梳理下具体的实现思路和代码示例,帮你快速把这个模块搭起来。
核心原理说明
psutil.net_io_counters(pernic=True)返回的是从系统启动以来的累计网络统计数据,比如你给出的示例里:
'Ethernet 5': snetio(bytes_sent=211080874L, bytes_recv=929895370L, packets_sent=667031L, packets_recv=2757846L, errin=0L, errout=0L, dropin=0L, dropout=0L)
其中bytes_sent和bytes_recv就是我们需要的累计收发字节数。要得到实时速度,我们只需要间隔固定时间取两次累计值,用差值除以时间间隔即可。
具体实现步骤
1. 安装psutil库
如果还没安装,先执行:
pip install psutil
2. 基础监控函数实现
下面是一个可直接复用的监控函数,包含速度计算和单位转换:
import psutil import time def get_ethernet_speed(interface_name, interval=1): """ 获取指定以太网接口的实时收发速度 参数: interface_name: 目标网卡名称(如'Ethernet 5') interval: 采样时间间隔(默认1秒) 返回: 包含收发速度的字典,支持字节/秒和MB/s两种单位 """ # 获取初始累计数据 initial_stats = psutil.net_io_counters(pernic=True)[interface_name] init_sent = initial_stats.bytes_sent init_recv = initial_stats.bytes_recv time.sleep(interval) # 获取间隔后的累计数据 current_stats = psutil.net_io_counters(pernic=True)[interface_name] curr_sent = current_stats.bytes_sent curr_recv = current_stats.bytes_recv # 计算速度(字节/秒) send_speed = (curr_sent - init_sent) / interval recv_speed = (curr_recv - init_recv) / interval # 转换为更易读的MB/s(保留两位小数) return { "send_bytes_per_sec": round(send_speed, 2), "recv_bytes_per_sec": round(recv_speed, 2), "send_mb_per_sec": round(send_speed / (1024 * 1024), 2), "recv_mb_per_sec": round(recv_speed / (1024 * 1024), 2) }
3. 持续监控示例
如果需要集成到性能程序中做持续监控,可以把函数放到循环里:
if __name__ == "__main__": # 替换成你的目标网卡名称 target_interface = "Ethernet 5" # 先验证网卡是否存在,避免报错 if target_interface not in psutil.net_io_counters(pernic=True): print(f"错误:未找到网卡 {target_interface}") print("可用网卡列表:", list(psutil.net_io_counters(pernic=True).keys())) exit(1) print(f"开始监控 {target_interface} 收发速度...(按Ctrl+C停止)") try: while True: speed_data = get_ethernet_speed(target_interface) print(f"发送速度: {speed_data['send_mb_per_sec']} MB/s | 接收速度: {speed_data['recv_mb_per_sec']} MB/s") time.sleep(1) except KeyboardInterrupt: print("\n监控已停止")
注意事项
- 确保网卡名称准确:可以用
print(list(psutil.net_io_counters(pernic=True).keys()))列出所有可用网卡名称 - 采样间隔可调整:如果需要更精确的瞬时速度,可缩小间隔;如果要统计平均速度,可增大间隔
- 异常处理:实际集成到性能程序时,建议添加网卡不存在、权限不足等异常处理逻辑
内容的提问来源于stack exchange,提问作者user3205436
相关产品推荐
相关产品推荐

