可通过PowerShell调用Windows性能计数器,结合Get-NetAdapter获取网卡带宽、Get-Counter采集Bytes Total/sec,按公式“利用率=(8×字节速率)/网卡带宽×100%”计算实时带宽利用率,并支持多服务器批量采样、错误处理与CSV导出。
可以通过 powershell 调用 windows 性能计数器(performance counter),采集网络接口的入站/出站字节数,结合采样间隔计算带宽利用率均值。关键在于使用 get-counter 获取原始字节速率(b/s),再换算为百分比(需知道网卡理论带宽),并支持多服务器批量执行。
获取单台服务器的实时带宽利用率(%)
Windows 不直接提供“利用率%”计数器,需手动计算:
利用率 = (8 × 字节速率 B/s) ÷ 网卡带宽 bps × 100%
其中“8”是字节转比特,“网卡带宽”需先查(如 1 Gbps = 1,000,000,000 bps)。常用做法是用 Get-NetAdapter 获取 LinkSpeed:
- 运行
Get-NetAdapter | Where-Object {$_.Status -eq 'Up'} | Select-Object Name,LinkSpeed查当前激活网卡及其带宽 - 用
Get-Counter '\Network Interface(*)\Bytes Total/sec'获取每秒总字节数(含收发) - 注意:计数器名称中的
*是通配符,实际需替换为具体网卡名(如'\Network Interface(Intel[R] Ethernet Connection)\Bytes Total/sec'),可用Get-Counter -ListSet 'Network Interface' | Select-Object -ExpandProperty Counter列出所有可用实例
批量采集多台服务器的均值(含错误处理与超时控制)
用 Invoke-Command 远程执行脚本块,避免本地逐台轮询。建议结构如下:
- 提前在目标服务器启用 WinRM(
winrm quickconfig)并配置信任(如Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*") - 定义服务器列表(数组或从 CSV 读取),对每台执行 3–5 次采样(间隔 2 秒),取
Bytes Total/sec平均值 - 脚本块内自动识别首块活动网卡、获取其 LinkSpeed,并计算平均利用率百分比
- 用
-ErrorAction SilentlyContinue和try/catch包裹远程调用,记录失败主机
输出带时间戳与统计结果的汇总表
将每台服务器的多次采样结果合并为一行,包含:服务器名、网卡名、理论带宽(Gbps)、平均字节速率(MB/s)、平均利用率(%)、采样次数、采集时间。示例关键代码片段:
$servers = 'srv01', 'srv02', 'srv03'
$results = foreach ($s in $servers) {
$data = Invoke-Command -ComputerName $s -ScriptBlock {
$nic = Get-NetAdapter | Where-Object Status -eq 'Up' | Select-Object -First 1
if (-not $nic) { return }
$counterPath = "\Network Interface($($nic.Name))\Bytes Total/sec"
$samples = 1..3 | ForEach-Object {
(Get-Counter -Counter $counterPath -MaxSamples 1).CounterSamples.CookedValue
Start-Sleep -Milliseconds 2000
}
$avgBytesPerSec = ($samples | Measure-Object -Average).Average
$utilPct = [math]::Round((8 * $avgBytesPerSec) / ($nic.LinkSpeed) * 100, 2)
[PSCustomObject]@{
Server = $env:COMPUTERNAME
Adapter = $nic.Name
LinkSpeedGB = [math]::Round($nic.LinkSpeed / 1Gb, 1)
AvgMBps = [math]::Round($avgBytesPerSec / 1MB, 2)
UtilPct = $utilPct
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
}
} -ErrorAction SilentlyContinue
$data
}
$results | Export-Csv bandwidth_report.csv -NoTypeInformation -Encoding UTF8
注意事项与优化建议
实际部署前需验证几点:
- 远程服务器必须运行 PowerShell 3.0+,且用户有性能监视权限(通常需 Administrators 或 Performance Monitor Users 组)
- 网卡 LinkSpeed 返回值单位是 bps(如 1000000000 表示 1 Gbps),注意单位换算;虚拟网卡(如 vEthernet)可能返回 10 Gbps 但实际受限于宿主,建议人工校准
- 若需长期监控,可改用
ScheduledTask每 5 分钟运行一次,追加写入 CSV 或导入 SQL Server - 高并发批量采集时,避免同时发起过多远程会话,可用
-ThrottleLimit 5限制并行数


















