none
ネットワークアダプタの受信バイト数の平均値を測定 RRS feed

  • 質問

  • 一定時間、ネットワークアダプタの受信バイト数を監視し、しきい値を超えた場合に通知する方法を考えています。

    こちらを参考に

    Get-WmiObject -class Win32_PerfRawData_Tcpip_NetworkInterface


    Get-Counter -Counter "\Network Interface(*)\Bytes Received/sec"

    関連しそうなキーワードにはいきつきますが、PowerShellの組み立て方が分かりません。

    Get-WMIObject  -ComputerName samplepc win32_processor ` | select __Server, @{name="CPUUtilization" ;expression ={“{0:N2}” -f (get-counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 5 |
        select -ExpandProperty countersamples | select -ExpandProperty cookedvalue | Measure-Object -Average).average}}` | Where-Object {[decimal]$_.CPUUtilization -gt [decimal]$cputhreshold}

    参考にしたサイトの上記の記述をどのように変更すれば、受信バイト数の平均を求めることができますでしょうか。

    ご教示ください。よろしくお願いします。


    • 編集済み TwSoft 2016年6月2日 6:33
    2016年6月2日 6:32

回答

  • > $threshold = 1048576 # 通知する閾値
    > とするべきでしょうか。

    PowerShellで「1MB」と記述すると「1048576」という数値に展開されます。
    つまり両者は同じ値なので記述を変える必要はありません。

    ちなみに、KB、GB、TB表記も可能です。

    >あるサーバーでパフォーマンスモニタを見ていると、イーサネットの受信が、絶えず7.0Mbps以上を上回っています。
    >(1秒間に約7メガバイト受信していると理解しています)

    Mbpsとは、mega bits per secondの略なので、「1秒間に7メガバイト」ではなく、「1秒間に7メガビット」となります。

    1バイト=8ビットでバイト数に換算すると、7.0Mbpsとは、「1秒間に約900キロバイト」ですね。

    >735487.264410203 くらいの数値が返ります。

    これは「1秒間に735487バイト=約718キロバイト=約5.6メガビット」となります。

    >Bytes Received/sec の値は、1秒あたりの「バイト数」だと理解しています。

    これは正しいです。

    つまり、例えば閾値を5Mbpsとしたいなら、ビットをバイトに変換するため、$threshold=5MB / 8 とする必要があります。


    • 回答としてマーク TwSoft 2016年6月3日 2:41
    2016年6月3日 2:38
    モデレータ
  • "\Network Interface(*)\Bytes Received/sec"のカウンタを使うなら、以下のような感じになるでしょうか。

    $threshold = 1MB # 通知する閾値
    $interval = 1 # サンプルを取る間隔(秒)
    $count = 5 # サンプルを取る回数
    $nicName = "realtek pcie gbe family controller" # 測定対象とするNIC名(全NICを対象にする場合は「*」)
    
    $bytesReceivedAverage = Get-Counter -Counter "\Network Interface($nicName)\Bytes Received/sec" -SampleInterval $interval -MaxSamples $count |
        select -ExpandProperty CounterSamples |
        select -ExpandProperty CookedValue |
        Measure-Object -Average |
        select -ExpandProperty Average
    
    if($bytesReceivedAverage -gt $threshold)
    {
        # Send-MailMessage を使って通知
    }

    例では$interval * $count = 5となるので、5秒間の平均値を取っています。

    2016年6月2日 19:53
    モデレータ

すべての返信

  • "\Network Interface(*)\Bytes Received/sec"のカウンタを使うなら、以下のような感じになるでしょうか。

    $threshold = 1MB # 通知する閾値
    $interval = 1 # サンプルを取る間隔(秒)
    $count = 5 # サンプルを取る回数
    $nicName = "realtek pcie gbe family controller" # 測定対象とするNIC名(全NICを対象にする場合は「*」)
    
    $bytesReceivedAverage = Get-Counter -Counter "\Network Interface($nicName)\Bytes Received/sec" -SampleInterval $interval -MaxSamples $count |
        select -ExpandProperty CounterSamples |
        select -ExpandProperty CookedValue |
        Measure-Object -Average |
        select -ExpandProperty Average
    
    if($bytesReceivedAverage -gt $threshold)
    {
        # Send-MailMessage を使って通知
    }

    例では$interval * $count = 5となるので、5秒間の平均値を取っています。

    2016年6月2日 19:53
    モデレータ
  • ありがとうございます。

    $threshold = 1MB # 通知する閾値

    ですが、

    $threshold = 1048576 # 通知する閾値

    とするべきでしょうか。

    あるサーバーでパフォーマンスモニタを見ていると、イーサネットの受信が、絶えず7.0Mbps以上を上回っています。

    (1秒間に約7メガバイト受信していると理解しています)

    その状態で実行したところ、if文に入ってほしいところですが入りません。$bytesReceivedAverage を出力すると、735487.264410203 くらいの数値が返ります。

    Bytes Received/sec の値は、1秒あたりの「バイト数」だと理解しています。

    PowerShell以前に、基本を理解していないのだと思いますが、よろしくお願いします。

    2016年6月3日 1:25
  • > $threshold = 1048576 # 通知する閾値
    > とするべきでしょうか。

    PowerShellで「1MB」と記述すると「1048576」という数値に展開されます。
    つまり両者は同じ値なので記述を変える必要はありません。

    ちなみに、KB、GB、TB表記も可能です。

    >あるサーバーでパフォーマンスモニタを見ていると、イーサネットの受信が、絶えず7.0Mbps以上を上回っています。
    >(1秒間に約7メガバイト受信していると理解しています)

    Mbpsとは、mega bits per secondの略なので、「1秒間に7メガバイト」ではなく、「1秒間に7メガビット」となります。

    1バイト=8ビットでバイト数に換算すると、7.0Mbpsとは、「1秒間に約900キロバイト」ですね。

    >735487.264410203 くらいの数値が返ります。

    これは「1秒間に735487バイト=約718キロバイト=約5.6メガビット」となります。

    >Bytes Received/sec の値は、1秒あたりの「バイト数」だと理解しています。

    これは正しいです。

    つまり、例えば閾値を5Mbpsとしたいなら、ビットをバイトに変換するため、$threshold=5MB / 8 とする必要があります。


    • 回答としてマーク TwSoft 2016年6月3日 2:41
    2016年6月3日 2:38
    モデレータ
  • 牟田口様

    ありがとうございます。

    お恥ずかしい限りです。基本を理解していませんね。

    >PowerShellで「1MB」と記述すると「1048576」という数値に展開されます

    勉強不足です。

    お陰様で実現に近づきました。

    最終的には、実現可能かどうかはさておき、

    $Servers = Get-Content C:/TEMP/serverlist.txt

    監視したいサーバーをファイルから読み込み、Get-WMIObjectでリモート監視したいと考えています。

    頑張ってみます。

    ありがとうございました。

    2016年6月3日 2:48