【Windows】Windows Serverのパフォーマンス検証方法(CPU・メモリ負荷テストをコマンドラインで実施)

windows

今回は、Windows Serverのパフォーマンス検証において、CPU・メモリ負荷テストをコマンドラインで実施する方法について、実務的な活用方法を詳しく解説します。

新しいサーバーの導入前、リソース増強後の効果測定、あるいはボトルネック調査など、Windows Serverのパフォーマンス検証は運用管理の重要なタスクです。しかし、専門的な負荷テストツールを導入するのは費用がかかり、簡単な負荷テストのためにわざわざツールを導入することは現実的ではありません。

本記事では、Windowsに標準搭載されているコマンドやPowerShellを活用した負荷テスト方法、リアルタイムでのパフォーマンス監視、テスト結果の分析方法まで、実務的な知識をお伝えします。


CPUとメモリの基本的な監視

負荷テストを実施する前に、現在のシステムリソース使用状況を確認することが重要です。

Windows標準のタスクマネージャーでの確認

# タスクマネージャーを起動
taskmgr.exe

# またはコマンドラインから性能情報を取得
systeminfo

より詳細な情報が必要な場合は、コマンドライン上で以下を実行します:

# CPU情報を表示
wmic cpu list brief

# メモリ情報を表示
wmic os get TotalVisibleMemorySize, FreePhysicalMemory

# リアルタイムのメモリ使用量を表示
wmic os get FreePhysicalMemory /format:list

PowerShellでのリアルタイム監視

# CPU使用率をリアルタイム監視
Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 10

# メモリ使用率をリアルタイム監視
Get-Counter -Counter "\Memory\% Committed Bytes In Use" -SampleInterval 1 -MaxSamples 10

# より簡潔な表示
while ($true) {
    $cpu = Get-WmiObject Win32_Processor | Measure-Object -Property LoadPercentage -Average | Select-Object Average
    Write-Host "CPU: $($cpu.Average)%"
    Start-Sleep -Seconds 1
}

PowerShellでのCPU負荷テスト

単純なCPU負荷テスト

PowerShellで数学的な計算を連続実行することで、CPUに負荷をかけます。

# 1つのコアに100%の負荷をかける(制御なし)
[int64]$x = 0
while ($true) {
    $x++
}

ただし、このスクリプトは無限ループするため、Ctrl+Cで停止する必要があります。

制御可能なCPU負荷テスト

より実用的には、負荷レベルと実行時間を制御するスクリプトを使用します:

param(
    [int]$Cores = 1,
    [int]$DurationSeconds = 60
)

Write-Host "CPU負荷テストを開始します"
Write-Host "対象コア数: $Cores"
Write-Host "実行時間: $DurationSeconds秒"

$StartTime = Get-Date
$EndTime = $StartTime.AddSeconds($DurationSeconds)

for ($i = 0; $i -lt $Cores; $i++) {
    Start-Job -ScriptBlock {
        param($Duration)
        $Start = Get-Date
        $End = $Start.AddSeconds($Duration)

        [int64]$x = 0
        while ((Get-Date) -lt $End) {
            # CPU集約的な計算
            for ([int64]$j = 0; $j -lt 1000000; $j++) {
                $x = [Math]::Sqrt($x + 1)
            }
        }
    } -ArgumentList $DurationSeconds
}

# 背景ジョブの完了を待機
Get-Job | Wait-Job

Write-Host "CPU負荷テスト完了"

実行方法:

# 4コアで120秒間のCPU負荷テスト
.\cpu_load_test.ps1 -Cores 4 -DurationSeconds 120

PowerShellでのメモリ負荷テスト

シンプルなメモリ割り当てテスト

param(
    [int]$SizeMB = 1024,
    [int]$DurationSeconds = 60
)

Write-Host "メモリ負荷テストを開始します"
Write-Host "割り当てサイズ: ${SizeMB}MB"
Write-Host "実行時間: $DurationSeconds秒"

# メモリを割り当て
$MemoryArray = New-Object byte[] ($SizeMB * 1MB)

# 割り当てたメモリにアクセスしてメモリを実際に確保させる
for ($i = 0; $i -lt $MemoryArray.Count; $i += 100) {
    $MemoryArray[$i] = [byte](Get-Random -Maximum 256)
}

Write-Host "割り当てたメモリへのアクセス開始"

$Start = Get-Date
$End = $Start.AddSeconds($DurationSeconds)

while ((Get-Date) -lt $End) {
    # メモリへのアクセスを継続
    $RandomIndex = Get-Random -Maximum $MemoryArray.Count
    $MemoryArray[$RandomIndex] = [byte](Get-Random -Maximum 256)

    # メモリ使用状況を定期的に表示
    if (((Get-Date).Second % 10) -eq 0) {
        $MemInfo = Get-WmiObject Win32_OperatingSystem
        $UsedMemory = ([int64]($MemInfo.TotalVisibleMemorySize - $MemInfo.FreePhysicalMemory) / 1KB / 1024)
        Write-Host "メモリ使用量: ${UsedMemory}MB"
    }

    Start-Sleep -Milliseconds 10
}

Write-Host "メモリ負荷テスト完了"

実行方法:

# 2GBのメモリを60秒間割り当て
.\memory_load_test.ps1 -SizeMB 2048 -DurationSeconds 60

複合的な負荷テスト

実際のシステム検証では、CPU とメモリの両方に負荷をかけることが多いです。

param(
    [int]$CPUCores = 2,
    [int]$MemoryMB = 1024,
    [int]$DurationSeconds = 120
)

Write-Host "複合負荷テストを開始します"
Write-Host "CPU コア数: $CPUCores"
Write-Host "メモリ: ${MemoryMB}MB"
Write-Host "実行時間: $DurationSeconds秒"

# CPU負荷ジョブを開始
for ($i = 0; $i -lt $CPUCores; $i++) {
    Start-Job -ScriptBlock {
        param($Duration)
        $Start = Get-Date
        $End = $Start.AddSeconds($Duration)
        [int64]$x = 0

        while ((Get-Date) -lt $End) {
            for ([int64]$j = 0; $j -lt 10000000; $j++) {
                $x = [Math]::Sqrt($x + 1)
            }
        }
    } -ArgumentList $DurationSeconds
}

# メモリ負荷ジョブを開始
$MemoryJob = Start-Job -ScriptBlock {
    param($Size, $Duration)
    $MemArray = New-Object byte[] ($Size * 1MB)

    for ($i = 0; $i -lt $MemArray.Count; $i += 1000) {
        $MemArray[$i] = [byte](Get-Random -Maximum 256)
    }

    $Start = Get-Date
    $End = $Start.AddSeconds($Duration)

    while ((Get-Date) -lt $End) {
        $idx = Get-Random -Maximum $MemArray.Count
        $MemArray[$idx] = [byte](Get-Random -Maximum 256)
        Start-Sleep -Milliseconds 5
    }
} -ArgumentList $MemoryMB, $DurationSeconds

# リアルタイム監視
Write-Host "リアルタイム監視開始..."
$TestStart = Get-Date
$TestEnd = $TestStart.AddSeconds($DurationSeconds)

while ((Get-Date) -lt $TestEnd) {
    $cpu = Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 1 | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue
    $mem = Get-WmiObject Win32_OperatingSystem | Select-Object -ExpandProperty FreePhysicalMemory

    $MemUsedGB = ([int64]($mem / 1KB / 1024 / 1024))
    Write-Host "$(Get-Date -Format 'HH:mm:ss') - CPU: $([math]::Round($cpu))% | Memory Free: $MemUsedGB GB"

    Start-Sleep -Seconds 5
}

# ジョブの完了を待機
Get-Job | Wait-Job
Get-Job | Remove-Job

Write-Host "複合負荷テスト完了"

パフォーマンスモニター(Perfmon)での監視

より詳細なデータ収集が必要な場合は、Windows標準のパフォーマンスモニターを使用します。

コマンドラインでの起動

# GUIのパフォーマンスモニターを起動
perfmon.exe

# または管理者権限で実行
perfmon /s

スクリプトでの自動監視ログ開始

# パフォーマンスログを自動開始
$LogName = "System Diagnostics"
$DataCollectorSet = Get-WmiObject -Path "winmgmts:\\.\root\PerfLogs:NT_EventTrace" -Filter "Name='$LogName'"

if ($DataCollectorSet) {
    Write-Host "データコレクターセット '$LogName' を開始"
    $DataCollectorSet.Start() | Out-Null
} else {
    Write-Host "データコレクターセット '$LogName' が見つかりません"
}

コマンドラインでのパフォーマンスカウンター取得

# CPU使用率を10秒間、1秒ごとに取得
Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 10 | Export-Counter -Path "C:\Temp\cpu_data.blg" -FileFormat BLG

# メモリ関連のカウンターを取得
Get-Counter -Counter "\Memory\Pages/sec", "\Memory\Available MBytes" -SampleInterval 1 -MaxSamples 60 | Export-Counter -Path "C:\Temp\memory_data.blg" -FileFormat BLG

テスト結果の記録と分析

ログファイルへの記録

$OutputFile = "C:\Temp\performance_test_$(Get-Date -Format yyyyMMdd_HHmmss).csv"
$Duration = 300  # 5分間

Write-Host "テスト結果を $OutputFile に記録します"

$Results = @()
$Start = Get-Date
$End = $Start.AddSeconds($Duration)

while ((Get-Date) -lt $End) {
    $cpu = Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 1 |
        Select-Object -ExpandProperty CounterSamples |
        Select-Object -ExpandProperty CookedValue

    $mem = Get-WmiObject Win32_OperatingSystem
    $MemUsedPercent = [math]::Round((($mem.TotalVisibleMemorySize - $mem.FreePhysicalMemory) / $mem.TotalVisibleMemorySize) * 100, 2)

    $Results += [PSCustomObject]@{
        Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        CPU_Percent = [math]::Round($cpu, 2)
        Memory_Used_Percent = $MemUsedPercent
    }

    Start-Sleep -Seconds 5
}

$Results | Export-Csv -Path $OutputFile -NoTypeInformation
Write-Host "テスト結果をファイルに保存しました: $OutputFile"

結果の統計分析

# 保存したCSVファイルの統計を計算
$Data = Import-Csv -Path "C:\Temp\performance_test_*.csv"

$CPUStats = $Data.CPU_Percent | Measure-Object -Average -Maximum -Minimum
$MemStats = $Data.Memory_Used_Percent | Measure-Object -Average -Maximum -Minimum

Write-Host "=== CPU使用率 ==="
Write-Host "平均: $([math]::Round($CPUStats.Average, 2))%"
Write-Host "最大: $([math]::Round($CPUStats.Maximum, 2))%"
Write-Host "最小: $([math]::Round($CPUStats.Minimum, 2))%"

Write-Host "=== メモリ使用率 ==="
Write-Host "平均: $([math]::Round($MemStats.Average, 2))%"
Write-Host "最大: $([math]::Round($MemStats.Maximum, 2))%"
Write-Host "最小: $([math]::Round($MemStats.Minimum, 2))%"

CPU・メモリピークの検出

パフォーマンス測定時に、異常値や予期しないピークを検出することは重要です。

# ピーク値を検出
$LogFile = "C:\Temp\performance_test.csv"
$Data = Import-Csv -Path $LogFile

# CPU使用率が80%以上の期間を検出
$CPUPeaks = $Data | Where-Object { [float]$_.CPU_Percent -gt 80 }

Write-Host "CPU使用率が80%を超えた期間:"
$CPUPeaks | Format-Table Timestamp, CPU_Percent

# メモリ使用率が85%以上の期間を検出
$MemPeaks = $Data | Where-Object { [float]$_.Memory_Used_Percent -gt 85 }

Write-Host "メモリ使用率が85%を超えた期間:"
$MemPeaks | Format-Table Timestamp, Memory_Used_Percent

ストレステストツールの活用

PowerShellスクリプト以外のツールを使用する場合もあります。

Windows標準ツール(RAMMap)

MicrosoftのRAMMapツール(Sysinternalsスイート)を使用してメモリを詳細に分析できます:

# RAMMapをダウンロード・実行
# https://docs.microsoft.com/en-us/sysinternals/downloads/rammap

# コマンドラインでの使用
rammap.exe -Ems

Prime95(CPU負荷テスト専用)

CPU負荷テストに特化したツール。本来はMersenne Prime検証用ですが、負荷テストツールとして活用されます:

# ダウンロード先
# https://www.mersenne.org/download/

# インストール後、GUIで負荷レベルを設定して実行

トラブルシューティング

ハマりポイント1:メモリ割り当てが実際に確保されない

メモリを割り当てても、アクセスしなければOSが実際には確保しません。メモリアクセスのコードを必ず含める必要があります。

ハマりポイント2:CPU負荷テストが途中で停止する

セキュリティソフトがPowerShellスクリプトを検知して停止させる場合があります。セキュリティソフトの除外設定を確認してください。

ハマりポイント3:メモリ不足でシステムが応答しなくなる

テスト前に、物理メモリの使用可能量を確認し、システム用に十分な余裕(最低1GB以上)を残すようにしてください。

# 使用可能メモリを確認
$mem = Get-WmiObject Win32_OperatingSystem
$AvailableMB = [int64]($mem.FreePhysicalMemory / 1KB)
Write-Host "利用可能メモリ: ${AvailableMB}MB"

まとめ

Windows Serverのパフォーマンス検証は、新規導入やリソース追加時に重要なタスクです。本記事の重要なポイントは以下の通りです:

  1. 事前に現在のリソース使用状況を確認する:テスト設定の基準になる
  2. PowerShellスクリプトで制御可能な負荷テストを実施する:簡単で効果的
  3. 複合的な負荷テストを実施する:実運用に近い条件をシミュレート
  4. テスト結果をログに記録し、統計を取る:後続の検討資料に
  5. ピーク値を検出し、異常値を分析する:システムの限界を理解

これらのテクニックを身につけることで、新しいサーバー導入やリソース拡張時の検証を効率的かつ低コストで実施できるようになります。

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

windowsITナレッジ
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。
得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。
※サーバ運用費がかかっているので、広告を掲載させて頂いてます。

StarTellerをフォローする
シェアする
StarTellerをフォローする
タイトルとURLをコピーしました