PowerShellでCPUとメモリ使用率を分析する方法を徹底解説

PowerShellは、Windows環境で効率的にシステム管理やリソース監視を行うための強力なツールです。特に、システムのCPUやメモリ使用率を分析する場合、PowerShellの「Get-Counter」コマンドを活用することで、リアルタイムのデータ収集や記録が簡単に行えます。この記事では、PowerShellを使ったパフォーマンスカウンターの基本的な利用方法から、CPUやメモリの詳細な監視方法、データを基にしたトラブルシューティングまで、実践的な手法を解説します。システム管理者だけでなく、リソース最適化に興味のあるすべてのユーザーにとって役立つ内容です。

目次

PowerShellでのパフォーマンスカウンターの基礎知識


パフォーマンスカウンターとは、Windowsが提供するシステムリソースの監視指標で、CPU、メモリ、ディスク、ネットワークなどの利用状況を測定するデータポイントを指します。PowerShellはこれらのカウンターを簡単に取得し、分析するための便利な方法を提供しています。

パフォーマンスカウンターとは


パフォーマンスカウンターは、以下のような情報を提供します:

  • CPU使用率:プロセッサの稼働状態を示す指標
  • メモリ利用率:システムが使用中の物理メモリ量
  • ディスクI/O:ストレージの読み書き速度
  • ネットワーク使用量:送受信データ量

これらの情報はシステムのパフォーマンスを評価し、ボトルネックの特定や最適化に役立ちます。

PowerShellでの基本操作


PowerShellでは、Get-Counterコマンドを使用してパフォーマンスカウンターのデータを取得します。このコマンドは、システムに設定されたすべてのカウンターまたは特定のカウンターの値を簡単に取得できます。

基本的なコマンドの例


以下はCPU使用率を取得する基本的なコマンドです:

Get-Counter "\Processor(_Total)\% Processor Time"


このコマンドにより、全体のCPU使用率を示すデータが返されます。

すべての利用可能なカウンターを確認する


使用可能なカウンターを一覧表示するには、以下のコマンドを実行します:

Get-Counter -ListSet *


これにより、取得可能なすべてのカウンターの詳細が確認できます。

データ収集の柔軟性


Get-Counterは、リアルタイムのデータ取得だけでなく、特定の間隔でデータを収集し続ける機能も備えています。例えば、5秒ごとに3回データを収集するには次のようにします:

Get-Counter "\Processor(_Total)\% Processor Time" -SampleInterval 5 -MaxSamples 3


この柔軟性により、短期的なトラブルシューティングから長期的なパフォーマンス監視まで幅広く対応可能です。

Get-Counterコマンドの使い方と活用例

PowerShellのGet-Counterコマンドは、パフォーマンスカウンターの情報を取得するための主要なツールです。このセクションでは、コマンドの基本的な使い方と具体的な活用例を紹介します。

基本的な使い方


Get-Counterは、カウンターの名前を指定することで、その値を取得します。
以下はコマンドの基本構文です:

Get-Counter -Counter "<カウンター名>"


例として、CPU使用率を取得する場合:

Get-Counter "\Processor(_Total)\% Processor Time"


出力例:

Timestamp                 CounterSamples
---------                 --------------
2025-01-17 12:00:00      \Processor(_Total)\% Processor Time : 45.3

複数カウンターの同時取得


複数のカウンターを一度に取得することも可能です。カウンター名をカンマで区切るだけです。

Get-Counter -Counter "\Processor(_Total)\% Processor Time", "\Memory\Available MBytes"


出力例:

Timestamp                 CounterSamples
---------                 --------------
2025-01-17 12:00:00      \Processor(_Total)\% Processor Time : 45.3
                          \Memory\Available MBytes : 2048

リアルタイムモニタリング


リアルタイムでモニタリングを行いたい場合、-SampleIntervalオプションを使用します。このオプションは、データ収集の間隔を秒単位で指定します。
例:10秒間隔でCPU使用率を5回取得

Get-Counter "\Processor(_Total)\% Processor Time" -SampleInterval 10 -MaxSamples 5


このコマンドを使用することで、リソース使用状況をリアルタイムで監視できます。

カスタムオブジェクトでのデータ活用


取得したデータをカスタムオブジェクトに変換することで、さらに柔軟な操作が可能になります。例えば、CPUとメモリのデータを整形して表示するには:

$data = Get-Counter -Counter "\Processor(_Total)\% Processor Time", "\Memory\Available MBytes" -SampleInterval 1 -MaxSamples 1
$data.CounterSamples | ForEach-Object {
    [PSCustomObject]@{
        CounterName = $_.Path
        Value       = $_.CookedValue
    }
}


この手法は、データの可視化やログの記録に便利です。

実用的な活用例

  1. サーバー負荷監視:CPU、メモリ、ディスクI/Oを同時に取得し、システムの負荷状態を診断。
  2. トラブルシューティング:特定のプロセスやアプリケーションのリソース使用量を確認。
  3. ログ記録:定期的にデータを収集し、履歴を記録して後から分析。

まとめ


Get-Counterコマンドは、システムの状態を効率的に把握し、パフォーマンスの最適化や問題解決をサポートする強力なツールです。これを習得することで、監視タスクが簡略化され、システム管理がより効果的に行えるようになります。

CPU使用率を監視する具体的手法

PowerShellを使用すると、CPU使用率をリアルタイムで監視し、システムの負荷状態を把握することが簡単に行えます。このセクションでは、CPU使用率を監視するための具体的な手法を詳しく解説します。

CPU使用率の基本取得


CPUの使用率を取得するには、Get-Counterコマンドを使用します。以下は全体のCPU使用率を確認する基本的なコマンドです:

Get-Counter "\Processor(_Total)\% Processor Time"


このコマンドは、全プロセッサの平均使用率をリアルタイムで取得します。

出力例

Timestamp                 CounterSamples
---------                 --------------
2025-01-17 12:00:00      \Processor(_Total)\% Processor Time : 42.7

プロセスごとのCPU使用率を確認


特定のプロセスのCPU使用率を監視する場合、以下のコマンドを使用します:

Get-Counter "\Process(<プロセス名>)\% Processor Time"


例:PowerShellプロセスのCPU使用率を確認する場合:

Get-Counter "\Process(powershell)\% Processor Time"

プロセス名の取得方法


特定のプロセス名が不明な場合は、以下のコマンドで確認できます:

Get-Process | Select-Object Name, Id

リアルタイムモニタリング


CPU使用率をリアルタイムで監視する場合、-SampleIntervalオプションを使用します。このオプションでデータ収集の間隔を秒単位で設定します。
例:5秒ごとにCPU使用率を取得する:

Get-Counter "\Processor(_Total)\% Processor Time" -SampleInterval 5

CPU使用率の平均値を計算


CPU使用率の平均値を計算するには、複数回のサンプルを取得して集計します。以下は10秒間隔で5回のサンプルを取得し、平均値を計算する例です:

$data = Get-Counter "\Processor(_Total)\% Processor Time" -SampleInterval 10 -MaxSamples 5
($data.CounterSamples | Measure-Object -Property CookedValue -Average).Average

カスタムスクリプトでの活用


CPU使用率を定期的に記録し、ログファイルに保存するカスタムスクリプトの例:

$logFile = "cpu_usage_log.txt"
1..10 | ForEach-Object {
    $usage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
    "$([datetime]::Now) - CPU Usage: $usage%" | Out-File -FilePath $logFile -Append
    Start-Sleep -Seconds 10
}


このスクリプトは、10秒間隔で10回分のCPU使用率をログに記録します。

まとめ


PowerShellを使用することで、CPU使用率の監視が簡単に行えます。基本的な取得からプロセスごとの詳細な監視、平均値の計算やログ記録まで、柔軟な方法が提供されています。これにより、システムパフォーマンスの可視化と効率的な管理が可能になります。

メモリ使用状況のリアルタイム監視

PowerShellを活用すると、システムのメモリ使用状況をリアルタイムで把握し、リソース消費に関する詳細な情報を取得できます。このセクションでは、メモリ使用量を監視するための具体的な手法を紹介します。

メモリ使用量の基本取得


メモリの空き容量や使用量を取得するには、以下のパフォーマンスカウンターを利用します:

Get-Counter "\Memory\Available MBytes"


このコマンドは、現在利用可能な物理メモリ容量をメガバイト単位で表示します。

出力例

Timestamp                 CounterSamples
---------                 --------------
2025-01-17 12:00:00      \Memory\Available MBytes : 2048

物理メモリ全体の情報を取得


メモリの全体的な状態を確認する場合、Get-CimInstanceコマンドを使用します。以下は物理メモリの合計容量と利用状況を取得する例です:

Get-CimInstance Win32_OperatingSystem | Select-Object TotalVisibleMemorySize, FreePhysicalMemory


出力例:

TotalVisibleMemorySize  FreePhysicalMemory
---------------------    -----------------
8388608                 2048000
  • TotalVisibleMemorySize: メモリの合計容量(KB単位)
  • FreePhysicalMemory: 空きメモリ容量(KB単位)

使用率をパーセンテージで計算


以下のスクリプトを使えば、物理メモリの使用率をパーセンテージで表示できます:

$os = Get-CimInstance Win32_OperatingSystem
$totalMemory = $os.TotalVisibleMemorySize
$freeMemory = $os.FreePhysicalMemory
$usedMemoryPercent = (($totalMemory - $freeMemory) / $totalMemory) * 100
"Memory Usage: {0:N2}%" -f $usedMemoryPercent

リアルタイムモニタリング


メモリ使用量を一定間隔でリアルタイムに監視するには、以下のコマンドを使用します:

Get-Counter "\Memory\Available MBytes" -SampleInterval 5 -MaxSamples 10


このコマンドは、5秒ごとに利用可能なメモリ容量を10回分取得します。

詳細なメモリ統計の取得


さらに詳細なメモリ情報を取得したい場合は、以下のカウンターを活用します:

  • コミット済みメモリ: \Memory\Committed Bytes
  • キャッシュされたメモリ: \Memory\Cache Bytes

例:複数のカウンターを取得する:

Get-Counter "\Memory\Committed Bytes", "\Memory\Cache Bytes"

ログへの記録


メモリ使用状況を記録し、後で分析する場合、以下のスクリプトを使用します:

$logFile = "memory_usage_log.txt"
1..10 | ForEach-Object {
    $memory = (Get-Counter "\Memory\Available MBytes").CounterSamples.CookedValue
    "$([datetime]::Now) - Available Memory: $memory MB" | Out-File -FilePath $logFile -Append
    Start-Sleep -Seconds 10
}


このスクリプトは、10秒間隔で10回分のデータをログファイルに記録します。

まとめ


PowerShellを使用することで、メモリ使用量の詳細な監視やログ記録が可能です。これにより、リソース不足やパフォーマンス問題を迅速に特定し、効率的なシステム管理が実現します。

カスタムスクリプトでリソース使用状況をログに保存する方法

リソースの使用状況を長期間にわたって記録し、分析するには、PowerShellのスクリプトを使用してログを保存する方法が効果的です。このセクションでは、CPUやメモリの使用状況をカスタムスクリプトで収集し、ログファイルに記録する方法を解説します。

ログ記録の基本スクリプト


以下のスクリプトは、CPU使用率とメモリ使用状況を定期的に記録し、テキストファイルに保存します。

# ログファイルのパスを指定
$logFile = "resource_usage_log.txt"

# サンプル収集間隔(秒)と収集回数を設定
$sampleInterval = 10
$maxSamples = 10

# ログ記録ループ
1..$maxSamples | ForEach-Object {
    # CPU使用率を取得
    $cpu = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue

    # メモリ使用量を取得
    $os = Get-CimInstance Win32_OperatingSystem
    $totalMemory = $os.TotalVisibleMemorySize / 1MB
    $freeMemory = $os.FreePhysicalMemory / 1MB
    $usedMemory = $totalMemory - $freeMemory

    # 現在の日時とリソース使用状況をログ形式で保存
    $logEntry = "{0} - CPU Usage: {1:N2}%, Used Memory: {2:N2} MB, Free Memory: {3:N2} MB" -f `
                (Get-Date), $cpu, $usedMemory, $freeMemory
    $logEntry | Out-File -FilePath $logFile -Append

    # 指定した間隔でスリープ
    Start-Sleep -Seconds $sampleInterval
}

Write-Host "ログ記録が完了しました。ログファイル: $logFile"

スクリプトの機能説明

  • CPU使用率の取得
    Get-Counterコマンドを使用して、全体のCPU使用率を取得します。
  • メモリ使用状況の計算
    Get-CimInstanceコマンドを使用して、メモリの合計容量と空き容量を取得し、使用量を計算します。
  • ログ形式
    各エントリはタイムスタンプ付きで記録され、以下の形式で保存されます:
  2025-01-17 12:00:00 - CPU Usage: 45.30%, Used Memory: 1024.00 MB, Free Memory: 2048.00 MB

CSV形式でのログ保存


CSV形式でログを保存する場合、Export-Csvコマンドレットを活用できます。

# ログ用データを格納する配列
$logData = @()

# データ収集ループ
1..$maxSamples | ForEach-Object {
    $cpu = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
    $os = Get-CimInstance Win32_OperatingSystem
    $totalMemory = $os.TotalVisibleMemorySize / 1MB
    $freeMemory = $os.FreePhysicalMemory / 1MB
    $usedMemory = $totalMemory - $freeMemory

    # ログデータをオブジェクト形式で追加
    $logData += [PSCustomObject]@{
        Timestamp    = Get-Date
        CPUUsage     = "{0:N2}" -f $cpu
        UsedMemoryMB = "{0:N2}" -f $usedMemory
        FreeMemoryMB = "{0:N2}" -f $freeMemory
    }

    Start-Sleep -Seconds $sampleInterval
}

# CSV形式で保存
$logData | Export-Csv -Path "resource_usage_log.csv" -NoTypeInformation

Write-Host "CSVログ記録が完了しました。CSVファイル: resource_usage_log.csv"

実用例と応用

  1. 長期間のリソーストレンド分析
    定期的なログ記録を行い、リソースの利用状況をトレンドとして分析します。
  2. 異常検知
    ログデータを解析して、異常値を検出するスクリプトと連携させることで、自動的なアラートを実現します。

まとめ


カスタムスクリプトを使用することで、リソース使用状況を効率的に記録し、後から分析や問題解決に活用できます。ログ記録はシステム管理の重要な手法の一つであり、継続的な監視によるパフォーマンス向上が期待できます。

データをグラフ化して視覚的に分析する方法

リソース使用状況を視覚化することで、システムの状態やトレンドをより直感的に理解できます。このセクションでは、PowerShellを用いて取得したCPUやメモリの使用データをグラフ化する手法を解説します。

グラフ化のための準備


PowerShellでは、Import-Moduleを使用してグラフ作成に適したモジュールを利用できます。最も一般的な選択肢は、System.Windows.FormsまたはMatplotlib.NETを活用する方法です。

必要なモジュールのインストール


PowerShellでは、PSWriteHTMLモジュールを使用して簡単にデータをグラフ化できます。以下のコマンドでインストールします:

Install-Module -Name PSWriteHTML -Force

CPUとメモリ使用状況のデータ収集


以下のスクリプトでCPUとメモリ使用状況を一定間隔で収集します:

# データ収集用変数
$data = @()

# サンプル収集間隔(秒)と収集回数
$sampleInterval = 5
$maxSamples = 10

# データ収集ループ
1..$maxSamples | ForEach-Object {
    $cpu = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
    $os = Get-CimInstance Win32_OperatingSystem
    $totalMemory = $os.TotalVisibleMemorySize / 1MB
    $freeMemory = $os.FreePhysicalMemory / 1MB
    $usedMemory = $totalMemory - $freeMemory

    # データを配列に追加
    $data += [PSCustomObject]@{
        Timestamp    = Get-Date
        CPUUsage     = [math]::Round($cpu, 2)
        UsedMemoryMB = [math]::Round($usedMemory, 2)
        FreeMemoryMB = [math]::Round($freeMemory, 2)
    }

    Start-Sleep -Seconds $sampleInterval
}

データをHTMLグラフで表示


PSWriteHTMLを利用して、収集したデータをグラフ化します。以下のスクリプトを使用してください:

# HTML出力ファイルのパス
$outputFile = "resource_usage_report.html"

# グラフの作成
$data | New-HTML -TitleText "CPU and Memory Usage" -FilePath $outputFile -Table -Chart -ChartType Line `
    -ChartColumns CPUUsage, UsedMemoryMB, FreeMemoryMB

Write-Host "レポートが作成されました: $outputFile"

生成されたHTMLファイルはブラウザで開くことができ、リアルタイムのリソース使用状況が視覚的に表示されます。

PowerShellでMatplotlib.NETを利用したグラフ作成


よりカスタマイズされたグラフが必要な場合は、Matplotlib.NETライブラリを活用できます。以下は基本的なグラフ作成の例です:

# 必要なモジュールをインストール
pip install matplotlib

# Pythonスクリプトの実行例
$data | ForEach-Object {
    $script = @"
import matplotlib.pyplot as plt

timestamps = ["Timestamp1", "Timestamp2", "Timestamp3"]
cpu_usage = [30, 45, 70]
memory_usage = [1024, 2048, 3072]

plt.plot(timestamps, cpu_usage, label='CPU Usage')
plt.plot(timestamps, memory_usage, label='Memory Usage')
plt.xlabel('Timestamp')
plt.ylabel('Usage')
plt.title('Resource Usage Over Time')
plt.legend()
plt.show()
"@
    & python -c $script
}

まとめ


データを視覚化することで、トレンドや異常値の検出が容易になります。PowerShellではPSWriteHTMLやPythonとの連携を活用して、CPUやメモリ使用状況を効果的に分析できます。視覚的なレポートは、システム管理者が迅速に問題を特定し、パフォーマンスを最適化する手助けとなります。

トラブルシューティングの実践例とベストプラクティス

システムのCPUやメモリの使用状況を監視することは重要ですが、異常を検知した場合の対応方法を知ることも同様に重要です。このセクションでは、PowerShellを使用したリソース使用状況のトラブルシューティングの実践例と、効果的な運用のためのベストプラクティスを解説します。

CPU使用率の異常検知と対処

高負荷プロセスの特定


CPU使用率が異常に高い場合、最も負荷をかけているプロセスを特定します:

Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 -Property Name, ID, CPU


出力例:

Name          ID       CPU
----          --       ---
chrome        1234     300.25
powershell    5678     150.12

上記の出力により、CPU時間を多く消費しているプロセスが判明します。必要に応じて、プロセスを停止することでシステムを安定化させることが可能です:

Stop-Process -Id 1234 -Force

特定のプロセスの詳細情報を確認


問題のプロセスについてさらに詳細な情報を取得するには、次のコマンドを使用します:

Get-Process -Id 1234 | Format-List *

メモリ不足の診断と解決

メモリを多く使用しているプロセスの特定


メモリの消費量が高いプロセスを特定するためのコマンド:

Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10 -Property Name, ID, WorkingSet


出力例:

Name          ID       WorkingSet
----          --       ----------
chrome        1234     500000000
powershell    5678     300000000

WorkingSetはメモリ使用量(バイト単位)を示します。

プロセスの強制終了


不要なプロセスを終了することで、メモリの再利用を促進します:

Stop-Process -Id 5678 -Force

ログと監視の自動化


継続的にシステムを監視し、異常が発生した場合に自動アラートを送信するスクリプトを実装します。
例:CPU使用率が90%を超えた場合に通知を送るスクリプト:

$threshold = 90
while ($true) {
    $cpu = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
    if ($cpu -gt $threshold) {
        Write-Host "警告: CPU使用率が高すぎます - 現在: $cpu%"
        # 必要に応じて通知やログ記録を追加
    }
    Start-Sleep -Seconds 5
}

ベストプラクティス

  1. 定期的な監視
    PowerShellスクリプトを利用して、リソース使用状況の定期的なログ記録を行い、異常のトレンドを早期に発見します。
  2. アラートの設定
    CPUやメモリ使用率が一定の閾値を超えた場合に、メール通知やログ記録を行うことで迅速な対応が可能になります。
  3. 不要なプロセスの抑制
    自動化されたスクリプトでリソースを大量に消費する不要なプロセスを定期的に特定し、必要に応じて停止します。
  4. データの可視化
    グラフやダッシュボードを作成し、システム状態を一目で把握できるようにします。
  5. トラブルシューティングの手順書作成
    異常発生時の手順書を用意し、迅速な対応ができるようにします。

まとめ


トラブルシューティングは、問題の特定と解決の迅速化が鍵です。PowerShellを使用することで、異常を検知し、自動化された対応や効率的な監視が可能になります。これらの方法を活用することで、システムのパフォーマンスを最適化し、安定性を向上させることができます。

まとめ

本記事では、PowerShellを使用してCPUやメモリの使用状況を監視、分析し、効率的にシステムリソースを管理する方法を解説しました。Get-Counterコマンドによる基本的なデータ収集から、カスタムスクリプトを用いたログ記録、さらにはグラフ化やトラブルシューティングの実践例まで、幅広い手法を紹介しました。

特に、リアルタイムでの監視やデータ可視化は、異常検知やトラブル対応を迅速化し、システムの安定性を高めるために役立ちます。適切なツールと手法を組み合わせて活用することで、効果的なリソース管理が可能になります。

ぜひこれらの方法を実践し、システムのパフォーマンス向上と安定性維持にお役立てください。

コメント

コメントする

目次