かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.206 限界を知る-パフォーマンスカウンターとの付き合い方(4)|セイテク・シス管道場(Web)

 

 

vol.206 限界を知る-パフォーマンスカウンターとの付き合い方(4)|セイテク・シス管道場(Web)

2026年06月01日配信
執筆者:山内 和朗

 「セイテク・シス管道場(Web)」では、Windows Serverの要素技術やシステム管理の基本的な部分に焦点を当てたいと思います。今回は前回に引き続き、パフォーマンスカウンターについて深掘りします。

 

実行環境により変わるパフォーマンスの上限

 CPUやメモリは100%という上限がありますが、ディスクやネットワークのパフォーマンスは物理的なハードウェアの能力によって、その上限が変わります。能力の限界を知ることは、異常の把握や実用的なしきい値を決める上で重要なことです。仮想マシン(VM)の場合は、仮想化プラットフォーム(特にクラウド)が提供する最大スループット(帯域)や最大IOPS、QoS(サービス品質)などの制限の影響を考慮する必要もあります。

 

無料のテストツール

 

 ディスクやネットワークのパフォーマンスの上限、限界を把握するには、意図的に高い負荷をかけてそのパフォーマンスを実測することです。その際に役立つ無料のツールをいくつか紹介します。どのツールもインストール不要で(.exeのコピーだけで)使用できる実行可能ファイルです。

ディスクパフォーマンステストツール:
microsoft/diskspd|GitHub ・・・ MicrosoftのWindows、Windows Server、およびクラウドサーバーインフラストラクチャのエンジニアリングチームが提供するストレージパフォーマンス測定ツール。

ネットワークパフォーマンステストツール:
NTttcp|Microsoft(github) ・・・ クライアント/サーバーで動作するネットワークスループット測定のためのコマンドラインツール。Linux版もある。
PsPing|Sysinternals(Microsoft Learn) ・・・ 高機能なICMP Ping機能に加えて、TCP接続の時間を計測するTCP Ping機能、クライアント/サーバーで動作するレイテンシテストおよび帯域幅テスト機能を提供するコマンドラインツール。

その他のツール:
CPUStres|Sysinternals(Microsoft Learn)  ・・・ 最大64のスレッドを実行してCPUアクティビティをシミュレートできるGUIツール。
NotMyFault|Sysinternals(Microsoft Learn) ・・・ Windowsのシステムをクラッシュさせたり、ハングさせたり、カーネルメモリリークを発生させたりできるGUI/コマンドラインツール。
TestLimit|Sysinternals(Microsoft Learn) ・・・ メモリ、ハンドル、プロセス、スレッド、その他のシステムオブジェクトのリソース不足の状況をシミュレートすることで、システムやアプリケーションのストレステストに使用できるコマンドラインツール。

DiskSpdを使用したディスクパフォーマンステストの例

 

 DiskSpdは多くのパラメーターを受け入れますが、一般的なディスクパフォーマンスの測定にそのまま使用できるコマンドラインを用意しました。知りたいのがIOPS性能なのか、スループットなのかによってコマンドラインが異なります。いずれも60秒間のテストを実施し、その結果をレポートします。なお、そのままと言いましたがパスは変更してください(画面1)。パスを省略するとカレントディレクトリにテストファイルが作成されます。

IOPS性能(D:¥ドライブを対象とした4Kランダム読み取り/書き込み):

diskspd -c8G -d60 -b4k -r -o32 -t8 -w0 -Sh D:¥test.dat
diskspd -c8G -d60 -b4k -r -o32 -t8 -w100 -Sh D:¥test.dat 


スループット(D:¥ドライブを対象とした シーケンシャル読み取り/書き込み):

diskspd -c8G -d60 -b1M -w0 -t4 -o1 -Sh -si D:\testfile.dat
diskspd -c8G -d60 -b1M -w100 -t4 -o1 -Sh -si D:\testfile.dat 

 

 通常、書き込み操作よりも読み取り操作のほうが高速であるため、最大のIOPSおよびスループットを知りたければ、読み取りのみ(-w0)の実行結果を見ればよいことになります。しかし、書き込みのみ(-w100)の実行結果も取得することで、能力の幅を把握できます。しきい値としては、その下限値(最大書き込みIOPS、スループット)を利用するのが一つの方法です。

 

画面1 DiskSpdを使用したD:ドライブのディスクの最大スループットの計測
画面1 DiskSpdを使用したD:ドライブのディスクの読み取り最大スループット(MiB/s)の計測

※MiB(メビバイト)はバイト数/1024/1024

 

NTTTCPを使用したネットワークパフォーマンステストの例

 

 NTTTCPを使用すると、2台のWindowsまたはLinuxコンピューター間でネットワーク帯域幅とスループットのパフォーマンスをテストを実施することができます。ここではWindowsの場合で説明します。

 NTTTCPは同じバイナリをサーバー(受信側)とクライアント(送信側)で動作させて計測するツールです。NTTTCPを2台のコンピューターにコピーしたら、サーバー側で次のコマンドラインを実行し、NTTTCPの通信をWindowsファイアウォールで許可します。

 

netsh advfirewall firewall add rule program=<パス>\ntttcp.exe name="ntttcp" protocol=any dir=in action=allow enable=yes profile=ANY


 その上で、サーバー側とクライアント側で次のコマンドラインを実行し、300秒間(または60秒など)のテストを実施します(画面2)。先にサーバー側でコマンドラインを実行して待ち受け状態にし、その後、クライアント側でコマンドラインを実行してテストを開始します。この例では、サーバー側(-r)は8スレッド(論理プロセッサ数×2)、CPU指定なし(*)で、サーバーはIPアドレス192.168.0.101のTCPポート5001以降(スレッド数分のポート、8スレッドの場合は5001~5008)でリッスンし、接続を受け付けます。クライアント側(-s)では、サーバー側と同じ-mと-tパラメーターを使用する必要があります。

サーバー側:

ntttcp -r -m 8,*,192.168.0.101 -t 300

クライアント側:

ntttcp -s -m 8,*,192.168.0.101 -t 300 

 

 テストが完了すると、サーバーとクライアントの両方にスループット(MB/s)を含むネットワークとCPUのパフォーマンス情報が表示されます(画面3)。

 

画面2 サーバー(受信側、画面右)とクライアント(送信側、画面左)でNTTTCPのコマンドラインを実行し、300秒間のテストを開始する
画面2 サーバー(受信側、画面右)とクライアント(送信側、画面左)でNTTTCPのコマンドラインを実行し、300秒間のテストを開始する


画面3 テストが完了すると、サーバーとクライアントの両方にスループット(MB/s)などのパフォーマンス情報が表示される
画面3 テストが完了すると、サーバーとクライアントの両方にスループット(MB/s)などのパフォーマンス情報が表示される
※MB(メガバイト)はバイト数/1000/1000


参考:
NTTTCP を使用して仮想マシンのネットワーク スループットをテストする|Azure(Microsoft Learn)

PsPingを使用したネットワークレイテンシ/帯域テスト

 

 PsPingをサーバーモード(-s)で実行すると、クライアントからのTCP接続を受け付け、ネットワークレイテンシや帯域をテストすることができます(画面4)。次の例では、サーバー側でPsPingをサーバーモード、IPv4、TCPポート8080で動作させ、クライアントから64KBのデータを10000回送信して、レイテンシ、帯域(送信)、帯域(受信)テストを実施します(画面4)。

サーバー側:

 psping -4 -f -s 192.168.0.101:8080 

クライアント側:

psping -l 16k -n 10000 192.168.0.101:8080 -nobanner
psping -b -l 16k -n 10000 192.168.0.101:8080 -nobanner
psping -b -l 16k -n 10000 r 192.168.0.101:8080 -nobanner 

 

画面4 PsPingをサーバーモード(画面右)で実行すると、クライアントのPsPingを使用してレイテンシテストや帯域テストを実施できる

画面4 PsPingをサーバーモード(画面右)で実行すると、クライアントのPsPing(画面左)を使用してレイテンシテストや帯域テストを実施できる

パフォーマンスデータの収集、集計スクリプト

 

 今回使い方を紹介したDiskSpdとNTTTCPはどちらも、ツール自身が詳細なパフォーマンス情報を出力してくれますが、ディスクやネットワークのパフォーマンス情報をパフォーマンスカウンターを使用して一定期間(60秒)計測するスクリプト「MeasureDiskPerf.ps1」および「MeasureNetPerf.ps1」を作成しました。DiskSpdやNTTTCPと同時に実行してみると、矛盾のない結果を示しました(画面5)。

 

画面5 負荷ツールによるパフォーマンスへの影響を測定する「MeasureDiskPerf.ps1」および「MeasureNetPerf.ps1」。画面左はDiskSpdとNTTTCPの実行結果
画面5 負荷ツールによるパフォーマンスへの影響を測定する「MeasureDiskPerf.ps1」および「MeasureNetPerf.ps1」。画面左はDiskSpdとNTTTCPの実行結果

[MeasureDiskPerf.ps1]プレーンテキストで表示、ダウンロード)

$results = Get-Counter "\PhysicalDisk(インスタンス名)\*" -SampleInterval 1 -MaxSamples 60
#インスタンス名は  (Get-Counter -ListSet PhysicalDisk).PathsWithInstances を実行して確認してください。例、 "\PhysicalDisk(1 d:)\*"

$csamples = $results.CounterSamples

$grouped = $csamples | Group-Object Path

$avg = @{}
foreach ($g in $grouped) {
    $avg[$g.Name] = ($g.Group.CookedValue | Measure-Object -Average).Average
}

foreach ($k in $avg.Keys) {
    switch ($k) {
        {$_ -match "% Idle Time"} {$diskidle = $avg[$k]}
        {$_ -match "Avg. Disk Queue Length"} {$adiskq = $avg[$k]}
        {$_ -match "Avg. Disk sec/Read"} {$adiskspr = $avg[$k]}
        {$_ -match "Avg. Disk sec/Write"} {$adiskspw = $avg[$k]}
        {$_ -match "Read Bytes/sec"} {$rbps = $avg[$k]}
        {$_ -match "Write Bytes/sec"} {$wbps = $avg[$k]}
        {$_ -match "Disk Reads/sec"} {$drps = $avg[$k]}
        {$_ -match "Disk Writes/sec"} {$dwps = $avg[$k]}
    }
}

$outstr = "% Disk Time : {0:N2} %" -f (100 - $diskidle)
$outstr += "`nAvg. Disk Queue Length : {0:N2}" -f $adiskq
$outstr += "`nAvg. Disk sec/Read : {0:N2} ms" -f ($adiskspr * 1000)
$outstr += "`nAvg. Disk sec/Write : {0:N2} ms" -f ($adiskspw * 1000)
$outstr += "`nThroughput : {0:N2} MiB/s" -f (($rbps + $wbps) / 1024 / 1024)
$outstr += "`nIOPS : {0:N2}" -f ($drps + $dwps)

$outstr

[MeasureNetPerf.ps1]プレーンテキストで表示、ダウンロード)
$results = Get-Counter "\Network Interface(インスタンス名)\*" -SampleInterval 1 -MaxSamples 60
#インスタンス名は  (Get-Counter -ListSet "Network Interface").PathsWithInstances を実行して確認してください。例、 "\Network Interface(Microsoft Hyper-V Network Adapter)\*"

$csamples = $results.CounterSamples

$grouped = $csamples | Group-Object Path

$avgbps = ($grouped | Where-Object {$_.Name -match "Bytes Total/sec"} | ForEach-Object {$_.Group.CookedValue} | Measure-Object -Average).Average
$maxsent = ($grouped | Where-Object {$_.Name -match "Bytes Sent/sec"} | ForEach-Object {$_.Group.CookedValue} | Measure-Object -Maximum).Maximum
$maxrcvd = ($grouped | Where-Object {$_.Name -match "Bytes Received/sec"} | ForEach-Object {$_.Group.CookedValue} | Measure-Object -Maximum).Maximum
$maxbps = [Math]::max($maxsent,$maxrcvd)
$outerr = ($grouped | Where-Object {$_.Name -match "Packets Outbound Errors"} | ForEach-Object {$_.Group.CookedValue} | Measure-Object -Maximum).Maximum
$recerr = ($grouped | Where-Object {$_.Name -match "Packets Received Errors"} | ForEach-Object {$_.Group.CookedValue} | Measure-Object -Maximum).Maximum
$bwidth = ($grouped | Where-Object {$_.Name -match "Current Bandwidth"} | ForEach-Object {$_.Group.CookedValue} | Measure-Object -Average).Average
$maxqlen = ($grouped | Where-Object {$_.Name -match "Output Queue Length"} | ForEach-Object {$_.Group.CookedValue} | Measure-Object -Maximum).Maximum

$outstr = "Avg. Throughput : {0:N2} Mbps ({1:N2} MB/s)" -f ($avgbps * 8 / 1000000),($avgbps / 1000000)
$outstr += "`nAvg. Bandwidth Use($($bwidth /1000000)M) : {0:N2} %" -f ($maxbps * 8 / $bwidth * 100)
$outstr += "`nMax. Output Queue Length : {0:N0}" -f $maxqlen
$outstr += "`nMax. Packets Outbound Errors : {0:N0}" -f $outerr
$outstr += "`nMax. Packets Recieved Errors : {0:N0}" -f $recerr
$outstr

netqos

※ 仮想環境(Hyper-V VMなど)では、帯域使用率は100%を超える場合があります。VMでは、ネットワークが仮想化に最適化されているため、ネットワークインターフェイス(NIC)が示す帯域幅(BandWidth、10000000000)は実際の通信性能とは一致しない、あくまでも理論上の上限、つまり飾りみたいなものだからだと思います。Hyper-VのネットワークQoS(帯域幅管理)機能を利用して、最大MbpsとしてNICの帯域幅を指定して計測するとよいかもしれません(10GbE NICの場合、10000.0 Mbps)。

 

KB/MB/GB/TB/PBとKiB/MiB/GiB/TiB

 KB(キロバイト)、MB(メガバイト)、GB(ギガバイト)、TB(テラバイト)、PB(ペタバイト)は10進数基準の単位、バイトを1000で割って計算します(2000000バイト=2000000/1000/1000=2MB)。KiB(キビバイト)、MiB(メビバイト)、GiB(ギビバイト)、TiB(テビバイト)、PiB(ぺ日バイト)は2進数基準の単位、バイトを1024で割って計算します(2000000バイト=2000000/1024/1024=約1.91MB)。かつてはKB/MB/GB/TB/PBは2進数基準で計算することが通常でしたが、厳密ではない(例: HDDのメーカーは10進数基準、OSは2進数基準で1GBのHDDなのに954MBと認識されるのはなぜ?)ため、IEC(国際電気標準会議)が1999年にKiB/MiB/GiB/TiB/PiBなどの2進接頭辞(binary prefixes) を標準化しました(IEC 60027-2 Amendment 2)。Linuxでは2進接頭辞の単位が取り入れされましたが、Windowsは実質KiB/MiB/GiB/TiB/PiBでありながら、今でも変わらずKB/MB/GB/TB/PB単位で表示します

mib
(WindowsのMB表示は実質2進数ベースのMiB、LinuxではMi(B)やGi(B)など2進接頭辞による表示が標準)

 

 セイテク・シス管道場(Web) (1) (2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)|(14)   

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事