今回は、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のパフォーマンス検証は、新規導入やリソース追加時に重要なタスクです。本記事の重要なポイントは以下の通りです:
- 事前に現在のリソース使用状況を確認する:テスト設定の基準になる
- PowerShellスクリプトで制御可能な負荷テストを実施する:簡単で効果的
- 複合的な負荷テストを実施する:実運用に近い条件をシミュレート
- テスト結果をログに記録し、統計を取る:後続の検討資料に
- ピーク値を検出し、異常値を分析する:システムの限界を理解
これらのテクニックを身につけることで、新しいサーバー導入やリソース拡張時の検証を効率的かつ低コストで実施できるようになります。
