\ network adapter(*)\ bytes total / sec vs. task manager / performance -powershell

时间:2018-04-19 11:47:28

标签: powershell

在Windows 10上,在任务管理器/性能中,它为网络适配器提供“接收”和“发送”的值。我很好奇MS如何做到这一点所以我想到了PowerShell中的性能计数器。所以我拼凑了一小段代码进行试验,把它放在后台工作中,这个:

$Computer = hostname;
$sndrecsum = {((get-counter -Counter '\network adapter(*)\Bytes Received/sec' -MaxSamples 30).CounterSamples | measure cookedvalue –Sum).Sum};
$sptstb = New-Object System.Net.WebClient;
$sptstb.DownloadFile('http://client.akamai.com/install/test-objects/10MB.bin', 'Out-Null');
Start-Job -Name sxrxs -scriptblock $sndrecsum -ArgumentList $Computer;
Get-Job -Name sxrxs | Wait-Job; $sndrecsumout = Get-Job -Name sxrxs | Receive-Job; ($sndrecsumout | measure -Maximum).Maximum

这是问题所在。输出'($ sndrecsumout | measure -Maximum).Maximum'应该是数组$ sndrecsumout中的最大值。它确实这样做但是数组中的最大值总是比它应该的低得多,并且永远不会匹配任务管理器/性能中显示的“接收”和“发送”(在转换为任务管理器/性能中显示的主要单位之后)同时)。所以我不确定任务管理器/性能是否正在使用性能计数器,或者我是否在某个地方搞砸了。

无论如何,有两个问题:首先,任务管理员/绩效如何获得“接收”和“发送”的值? - 和 - 两个,我搞砸了我想要这样做的方式吗?

提前感谢您的回复和建议。

1 个答案:

答案 0 :(得分:0)

好吧,我想我已经弄明白了,至少有一点,也许。这跟踪界面的Windows 10性能监视器;

$sptst = New-Object System.Net.WebClient; $Computer = hostname; $strlf += $("" | Out-String);
$totx = {
  get-counter -Counter '\Network Interface(Intel[R] Ethernet Connection [2] I218-V)\Bytes Total/sec' -MaxSamples 40 | ForEach {[math]::Round((($_.countersamples.cookedvalue | measure -sum).sum / 1Mb), 4)}
    };
  $recx = {
  get-counter -Counter '\network Interface(Intel[R] Ethernet Connection [2] I218-V)\Bytes Received/sec' -MaxSamples 40 | ForEach {[math]::Round((($_.countersamples.cookedvalue | measure -sum).sum / 1Mb), 4)}
    };
    $sntx = {
get-counter -Counter '\network Interface(Intel[R] Ethernet Connection [2] I218-V)\Bytes Sent/sec' -MaxSamples 40 | ForEach {[math]::Round((($_.countersamples.cookedvalue | measure -sum).sum / 1Mb), 4)}
    };

Start-Job -Name xtot -scriptblock $totx  -ArgumentList $Computer;
Start-Job -Name xrec -scriptblock $recx  -ArgumentList $Computer;
Start-Job -Name xsnt -scriptblock $sntx  -ArgumentList $Computer;

$ts = Measure-Command -Expression {$sptst.DownloadFile('http://testmy.net/dl-10MB', 'Out-Null')}; $dxtmex = [math]::Round($ts.TotalSeconds, 4);

Get-Job -Name xtot -HasMoreData $True | Wait-Job ; $outxtot = Get-Job -Name xtot | Receive-Job; 
$xthrx = ($outxtot | measure -Maximum).Maximum; $testnuma = $xthrx -match '^[\d\.]+$'; if ($testnuma -eq 'True') {$MBxthrx = $xthrx; $Mbpsxthrx = $xthrx / 0.125};

Get-Job -Name xrec -HasMoreData $True | Wait-Job; $outxrec = Get-Job -Name xrec | Receive-Job; 
$xrecx = ($outxrec | measure -Maximum).Maximum  ; $testnumb = $xrecx -match '^[\d\.]+$'; if ($testnumb -eq 'True') {$MBxrecx = $xrecx; $Mbpsxrecx = $xrecx / 0.125};

Get-Job -Name xsnt -HasMoreData $True | Wait-Job; $outxsnt = Get-Job -Name xsnt | Receive-Job; 
$xsntx = ($outxsnt | measure -Maximum).Maximum  ; $testnumb = $xsntx -match '^[\d\.]+$'; if ($testnumb -eq 'True') {$MBxsntx = $xsntx; $Mbpsxsntx = $xsntx / 0.125};

$txtl = '|Throughput = ' + $Mbpsxthrx + ' Mbps (' + $MBxthrx + ' MB/s) [ Test Time = ' + $dxtmex + ' seconds ]';

$rxsx = 'Received (D/L) : ' + $Mbpsxrecx + ' Mbps (' + $MBxrecx + ' MB/s)' + ' / Sent (U/L) : ' + $Mbpsxsntx + ' Mbps (' + $MBxsntx + ' MB/s)';

Return $txtl + $strlf + $rxsx

编辑:删除了之前的答案 - 这个更好,更好。忽略标签'吞吐量' - '收到(D / L)' - '已发送(U / L)',因为它们只是在玩它时要区分它,所以如果需要,可以随意调用它们。 Windows性能监视器中的“吞吐量”表示为百分比而不是这样,但是当在数学中转换为百分比时,上面代码中的“吞吐量”表示的结果(上面的代码中未显示)似乎与perf监视器一起跟踪,这是为什么我在这里选择了“吞吐量”标签。另外在此过程中想出如何获取接口的正确实例名称以供在计数器中使用,我没有显示它的用法(或代码)这篇文章,只是将接口名称放在上面的代码中,以保持严格按照主题,但如果有人想看到它可以做,我也会在这里发布。我可能会稍后回来并发布它,如果它在这篇文章中的确定,如果不是你可以删除它,如果你希望它是否会偏离主题一些。欢迎任何改进/建议。

谢谢。