Windows平台下如何通过命令行工具或API获取指定时间段内各进程的网络流量数据?
Windows平台下如何通过命令行工具或API获取指定时间段内各进程的网络流量数据?
你现在的需求是在自动化基准测试中,精准统计指定时间段内每个进程的网络收发字节数,对吧?结合你已经考虑过的工具,我给你几个更贴合自动化场景的方案:
1. 利用Windows原生性能计数器(Performance Counters)
这是最省事的原生方案,不需要额外安装工具,支持命令行调用和API集成:
- 命令行可以用
typeperf工具,在基准测试前后分别采样进程的网络流量计数器,计算差值:
之后用PowerShell脚本读取两个CSV文件,按进程名称匹配,计算每个进程的收发字节差值即可。# 记录初始值 typeperf "\Process(*)\TCP Bytes Sent" "\Process(*)\TCP Bytes Received" -sc 1 -o baseline.csv # 运行你的基准测试... # 记录结束值 typeperf "\Process(*)\TCP Bytes Sent" "\Process(*)\TCP Bytes Received" -sc 1 -o final.csv - 如果要集成到你的代码里,可以用Performance Data Helper (PDH) API,直接查询这些计数器,能更灵活地控制采样时机和数据处理。
2. Sysinternals Procmon的命令行模式
你之前觉得Procmon是GUI不好自动化,但其实它支持完全命令行操作,还能过滤仅网络事件:
- 启动网络相关事件捕获:
procmon /n /backingfile benchmark_net.pml /filter "Operation Is Send OR Operation Is Receive" - 运行完基准测试后,停止捕获:
procmon /terminate - 把捕获的数据导出为CSV方便统计:
procmon /open benchmark_net.pml /saveas benchmark_net.csv /format csv - 最后用PowerShell或Python脚本解析CSV,按进程名称/PID分组统计总收发字节数。
3. Windows事件跟踪(ETW)+ Logman/Tracerpt
这是高效的底层原生方案,性能开销低,适合高精度统计:
- 启动TCPIP相关的ETW跟踪:
logman start net_trace -p Microsoft-Windows-TCPIP -o net_trace.etl -ets - 运行基准测试后停止跟踪:
logman stop net_trace -ets - 把ETL日志解析为CSV格式:
tracerpt net_trace.etl -o net_trace.csv -of csv - 解析后的CSV里会包含进程ID、网络操作类型和字节数,你可以用脚本轻松统计每个进程的总流量。
4. 轻量第三方工具:NirSoft CurrPorts
这个工具体积小,命令行支持导出进程的累计网络流量:
- 基准前后分别导出数据:
cports.exe /scomma before.csv # 运行你的基准测试... cports.exe /scomma after.csv - 对比两个CSV文件,计算每个进程的流量差值即可。
另外补充下你之前考虑的工具的优化点:
- 资源监控器的采样逻辑其实和性能计数器同源,用
typeperf就能实现命令行版的定时采样统计; - 网络监视器/Wireshark的包捕获确实低效,上面的方案都是基于系统统计数据而非原始包,性能开销小很多,更适合自动化基准测试场景。
备注:内容来源于stack exchange,提问作者davidair
相关产品推荐
相关产品推荐

