PowerShellでWindowsのパフォーマンスモニタリングを自動化し閾値超過時にログ取得する方法

PowerShellを活用してWindowsのパフォーマンスモニタリングを自動化し、特定の閾値を超えた際にログを取得する方法を解説します。システムのリソース使用率をリアルタイムで監視し、異常が検出された場合に迅速に対応することは、安定した運用のために重要です。特に、CPU使用率やメモリ消費量、ディスクI/Oなどのリソースを継続的に監視することで、パフォーマンス低下の原因を特定しやすくなります。

本記事では、PowerShellのGet-Counterコマンドレットを使用してパフォーマンスカウンタを取得する方法や、特定の閾値を超えた際にアラートを発生させ、ログを記録する仕組みについて解説します。また、タスクスケジューラを利用してスクリプトを定期実行する方法や、複数のカウンタを同時に監視する応用例についても紹介します。

これにより、PowerShellを用いたWindowsのパフォーマンス管理を効率化し、システムの安定性を向上させるための知識を習得できます。

目次

PowerShellによるパフォーマンスモニタリングの概要


Windowsのシステムパフォーマンスを継続的に監視することは、システムの安定性を維持し、異常を迅速に検出するために重要です。パフォーマンスモニタリングとは、CPU使用率、メモリ消費量、ディスクI/O、ネットワークトラフィックなどのリソースの状態を記録し、問題発生時に素早く対処するための手法です。

Windowsにおけるパフォーマンスモニタリング


Windowsには、パフォーマンスモニタ(Performance Monitor, perfmon.exe)やリソースモニタ(Resource Monitor)といったGUIツールがありますが、これらは手動操作が必要なため、定期的な監視や自動アラートを設定するには不向きです。そこで、PowerShellを活用すると、コマンドベースでシステムパフォーマンスをリアルタイムで監視し、自動化することが可能になります。

PowerShellを利用するメリット


PowerShellでパフォーマンスモニタリングを行うメリットは以下の通りです。

  • 自動化が可能:スクリプトを作成し、タスクスケジューラなどで定期実行できる。
  • 柔軟な監視設定:特定のカウンタのみを対象にしたり、異常発生時の処理を自由にカスタマイズ可能。
  • ログ取得とアラート通知:リソースの使用率が閾値を超えた際に、自動的にログを記録したり、メール通知を送ることができる。

PowerShellを活用したパフォーマンス監視の流れ

  1. 監視対象とするパフォーマンスカウンタを決定する(例:CPU使用率、メモリ消費量、ディスクI/O など)。
  2. Get-Counterコマンドレットを使用して、指定したカウンタの値を取得する。
  3. 取得した値を解析し、閾値を超えた場合にアラートを発生させる。
  4. ログを保存し、必要に応じて通知を送る。
  5. スクリプトをタスクスケジューラで定期的に実行し、自動監視を実現する。

このように、PowerShellを活用することで、Windowsのパフォーマンスを効率的に監視し、異常が発生した際に迅速に対応できる仕組みを構築できます。次のセクションでは、具体的にPowerShellで取得可能なパフォーマンスカウンタについて解説します。

PowerShellで収集できるパフォーマンスカウンタ


PowerShellでは、Windowsのさまざまなパフォーマンスカウンタを取得できます。これにより、CPU、メモリ、ディスク、ネットワークなどのリソース使用状況をリアルタイムで監視し、パフォーマンスの最適化やトラブルシューティングに活用できます。

主要なパフォーマンスカウンタ


PowerShellのGet-Counterコマンドレットを使用すると、以下のようなパフォーマンスカウンタを取得できます。

CPU関連のカウンタ

  • Processor(_Total)\% Processor Time: CPU全体の使用率
  • Processor(_Total)\% Privileged Time: カーネルモードでのCPU使用率
  • Processor(_Total)\% User Time: ユーザーモードでのCPU使用率

メモリ関連のカウンタ

  • Memory\Available MBytes: 利用可能なメモリ量(MB単位)
  • Memory\Committed Bytes: 使用中のコミットメモリ量
  • Memory\Page Faults/sec: ページフォールトの発生回数

ディスク関連のカウンタ

  • PhysicalDisk(_Total)\% Disk Time: ディスクの使用率
  • PhysicalDisk(_Total)\Avg. Disk Queue Length: ディスクのI/Oキューの長さ
  • PhysicalDisk(_Total)\Disk Reads/sec: 1秒あたりのディスク読み込み回数
  • PhysicalDisk(_Total)\Disk Writes/sec: 1秒あたりのディスク書き込み回数

ネットワーク関連のカウンタ

  • Network Interface(*)\Bytes Total/sec: 送受信データの総バイト数
  • Network Interface(*)\Packets/sec: 1秒あたりのパケット数
  • Network Interface(*)\Current Bandwidth: 現在のネットワーク帯域幅

カウンタ一覧を取得する方法


使用可能なパフォーマンスカウンタの一覧を取得するには、以下のコマンドを実行します。

Get-Counter -ListSet * | Select-Object -ExpandProperty Paths

特定のカテゴリ(例:CPU)に絞り込む場合は、以下のように実行します。

Get-Counter -ListSet "Processor" | Select-Object -ExpandProperty Paths

特定のカウンタ値を取得する方法


特定のカウンタの現在値を取得するには、以下のようにGet-Counterコマンドレットを使用します。

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

また、複数のカウンタを同時に取得することも可能です。

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

まとめ


PowerShellを使用すると、Windowsの主要なパフォーマンスカウンタを簡単に取得できます。これらのカウンタを利用してシステムのリソース使用状況を監視し、異常が発生した際に適切な対策を講じることができます。次のセクションでは、これらのカウンタを取得するための基本的なGet-Counterコマンドレットの使い方を詳しく解説します。

Get-Counterコマンドレットの使い方


PowerShellのGet-Counterコマンドレットは、Windowsのパフォーマンスカウンタを取得するための主要なコマンドです。このコマンドを使用することで、CPU使用率やメモリ使用量、ディスクI/O、ネットワークトラフィックなどのシステムパフォーマンス情報をリアルタイムで取得できます。

基本的な使い方


特定のパフォーマンスカウンタの値を取得する基本的な構文は以下の通りです。

Get-Counter "<パフォーマンスカウンタ名>"

例えば、CPU使用率(% Processor Time)を取得する場合は、以下のように実行します。

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

このコマンドを実行すると、現在のCPU使用率を示すデータが取得されます。

複数のカウンタを同時に取得する


複数のパフォーマンスカウンタを同時に取得する場合は、カウンタ名をカンマ(,)で区切ります。

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

このコマンドを実行すると、CPU使用率、利用可能メモリ量、ディスク使用率のデータが一度に取得できます。

リアルタイム監視(連続取得)


一定の間隔でカウンタを取得し、リアルタイムで監視するには、-Continuousオプションを使用します。

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

このコマンドは、Ctrl + Cを押すまでCPU使用率を継続的に取得し続けます。

一定間隔でデータを取得する


一定間隔(秒単位)でデータを取得し、指定回数分取得する場合は、-SampleInterval-MaxSamplesオプションを組み合わせます。

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

このコマンドは、2秒ごとに5回CPU使用率を取得します。

取得したデータの表示形式


デフォルトでは、取得したカウンタのデータはオブジェクト形式で返されます。取得データのうち、実際の値のみを表示するには、以下のようにCookedValueプロパティを指定します。

(Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue

このコマンドは、CPU使用率の数値のみを出力します。

スクリプトへの活用


取得した値を変数に格納し、条件分岐を行うことで、特定の閾値を超えた際にアクションを実行できます。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue

if ($cpuUsage -gt 80) {
    Write-Output "警告: CPU使用率が80%を超えました!"
}

このスクリプトでは、CPU使用率が80%を超えた場合に警告メッセージを出力します。

まとめ


Get-Counterコマンドレットを使用すると、Windowsのパフォーマンスカウンタを取得し、リアルタイム監視やログの記録が可能になります。次のセクションでは、取得したデータを活用し、閾値を設定して自動的にアラートを発生させる方法について解説します。

閾値の設定と自動アラートの仕組み


パフォーマンスモニタリングを行う際、特定のリソース(CPU使用率、メモリ使用量など)が一定の閾値を超えた場合にアラートを発生させることが重要です。PowerShellを使用すると、条件に応じたアラートの自動化が可能になります。

閾値の設定


まず、監視対象のパフォーマンスカウンタの値を取得し、それが設定した閾値を超えた場合に処理を実行するスクリプトを作成します。以下は、CPU使用率が80%を超えた場合に警告を出力する例です。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue

$threshold = 80  # 閾値(%)

if ($cpuUsage -gt $threshold) {
    Write-Output "警告: CPU使用率が$cpuUsage%を超えました!"
}

このスクリプトを定期実行することで、CPUの異常な負荷を検知できます。

ログを記録する


閾値を超えた際の情報をログに記録することで、後から分析が可能になります。以下のスクリプトでは、CPU使用率が閾値を超えた場合にログファイル(cpu_alert.log)に記録します。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$threshold = 80
$logFile = "C:\Logs\cpu_alert.log"

if ($cpuUsage -gt $threshold) {
    $logEntry = "$(Get-Date) - 警告: CPU使用率が$cpuUsage%を超えました!"
    Add-Content -Path $logFile -Value $logEntry
    Write-Output $logEntry
}

このスクリプトを実行すると、C:\Logs\cpu_alert.logに警告メッセージが記録されます。

イベントログへの記録


Windowsのイベントログに記録することで、システムの監査ログとして活用できます。以下のスクリプトは、閾値超過時にWindowsイベントログへ記録する例です。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$threshold = 80

if ($cpuUsage -gt $threshold) {
    $eventMessage = "CPU使用率が$cpuUsage%を超えました。"
    Write-EventLog -LogName Application -Source "PowerShell" -EntryType Warning -EventId 1001 -Message $eventMessage
}

このスクリプトを実行すると、Windowsの「イベントビューアー」→「アプリケーションログ」に警告メッセージが記録されます。

メール通知の設定


PowerShellを使用して、閾値を超えた際にメール通知を送信することも可能です。以下のスクリプトは、CPU使用率が閾値を超えた場合に、管理者へ警告メールを送信する例です。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$threshold = 80

if ($cpuUsage -gt $threshold) {
    $smtpServer = "smtp.example.com"
    $from = "alert@example.com"
    $to = "admin@example.com"
    $subject = "CPU使用率警告"
    $body = "警告: CPU使用率が$cpuUsage%を超えました。"

    Send-MailMessage -SmtpServer $smtpServer -From $from -To $to -Subject $subject -Body $body
}

このスクリプトを実行すると、指定したメールアドレスに警告メッセージが送信されます。

一定間隔で監視する方法


PowerShellスクリプトを定期的に実行し、継続的に監視するには、以下のようにwhileループを使用します。

while ($true) {
    $cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
    $threshold = 80
    $logFile = "C:\Logs\cpu_alert.log"

    if ($cpuUsage -gt $threshold) {
        $logEntry = "$(Get-Date) - 警告: CPU使用率が$cpuUsage%を超えました!"
        Add-Content -Path $logFile -Value $logEntry
        Write-Output $logEntry
    }

    Start-Sleep -Seconds 10  # 10秒間隔で監視
}

このスクリプトは、10秒ごとにCPU使用率を取得し、閾値を超えた場合にログを記録します。

まとめ


PowerShellを使用すると、パフォーマンスカウンタを取得し、特定の閾値を超えた場合に自動的にログを記録したり、イベントログに記録したり、メール通知を送ることができます。次のセクションでは、取得したデータをどのように保存し、分析するかについて解説します。

ログの取得と保存の方法


パフォーマンスモニタリングにおいて、閾値を超えた際の情報を記録することで、システムの異常を特定し、問題解決に役立てることができます。PowerShellを使用すると、閾値超過時に自動でログを記録し、ファイルやイベントログに保存することが可能です。

テキストファイルにログを記録する


PowerShellのAdd-Contentコマンドを使用すると、監視データをテキストファイルに記録できます。以下のスクリプトは、CPU使用率が80%を超えた場合にログファイルへ記録する例です。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$threshold = 80
$logFile = "C:\Logs\performance_log.txt"

if ($cpuUsage -gt $threshold) {
    $logEntry = "$(Get-Date) - CPU使用率が$cpuUsage%を超えました。"
    Add-Content -Path $logFile -Value $logEntry
    Write-Output "ログに記録しました: $logEntry"
}

このスクリプトを定期的に実行することで、CPU使用率が閾値を超えた際の履歴を蓄積できます。

CSVファイルにログを保存する


CSV形式でログを保存すると、Excelなどで簡単にデータ分析が可能になります。以下のスクリプトは、CPU使用率をCSVファイルに記録する例です。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$threshold = 80
$logFile = "C:\Logs\performance_log.csv"

# ログエントリ作成
$logEntry = [PSCustomObject]@{
    Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    CPU_Usage = $cpuUsage
}

# CSVファイルへ追加
$logEntry | Export-Csv -Path $logFile -Append -NoTypeInformation

Write-Output "ログをCSVに記録しました: $logEntry"

このスクリプトを実行すると、以下のようなCSVデータが蓄積されます。

"Timestamp","CPU_Usage"
"2025-01-30 12:00:01","85.3"
"2025-01-30 12:05:02","90.1"

この形式なら、Excelで開いてグラフ化することも簡単にできます。

イベントログに記録する


Windowsのイベントログに記録することで、システム監査の一環として活用できます。以下のスクリプトは、CPU使用率が80%を超えた場合に、Windowsのアプリケーションイベントログへ記録する例です。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$threshold = 80

if ($cpuUsage -gt $threshold) {
    $eventMessage = "CPU使用率が$cpuUsage%を超えました。"
    Write-EventLog -LogName Application -Source "PowerShell" -EntryType Warning -EventId 1001 -Message $eventMessage
    Write-Output "イベントログに記録しました: $eventMessage"
}

このスクリプトを実行すると、「イベントビューアー」→「アプリケーション」に警告が記録されます。

JSONファイルに記録する


JSON形式でログを記録すると、後でプログラムから解析しやすくなります。以下のスクリプトは、CPU使用率をJSONファイルに記録する例です。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$threshold = 80
$logFile = "C:\Logs\performance_log.json"

$logEntry = @{
    Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    CPU_Usage = $cpuUsage
} | ConvertTo-Json -Depth 1

# JSONファイルに追記
Add-Content -Path $logFile -Value $logEntry

Write-Output "ログをJSONに記録しました: $logEntry"

このスクリプトを実行すると、JSON形式でログが記録され、プログラムから簡単に解析できるようになります。

一定間隔で監視しながらログを取得する


一定間隔でログを取得し、継続的に記録するには、whileループとStart-Sleepを組み合わせます。

$logFile = "C:\Logs\performance_log.csv"
$threshold = 80

while ($true) {
    $cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

    if ($cpuUsage -gt $threshold) {
        $logEntry = "$timestamp, $cpuUsage"
        Add-Content -Path $logFile -Value $logEntry
        Write-Output "記録しました: $logEntry"
    }

    Start-Sleep -Seconds 10  # 10秒ごとに監視
}

このスクリプトは、CPU使用率が80%を超えた場合に、10秒ごとにログを記録し続けます。

まとめ


PowerShellを使えば、取得したパフォーマンスデータをテキストファイル、CSV、JSON、イベントログなどに記録できます。これにより、異常が発生した際の証跡を残し、後で詳細な分析が可能になります。次のセクションでは、PowerShellスクリプトを定期的に実行する方法として、Windowsタスクスケジューラの活用方法を解説します。

スクリプトのスケジュール実行(タスクスケジューラ活用)


PowerShellで作成したパフォーマンスモニタリングスクリプトを定期的に実行するには、Windowsタスクスケジューラを使用します。タスクスケジューラを利用すれば、手動でスクリプトを実行する必要がなく、設定した間隔で自動的にパフォーマンス監視が実行されます。

タスクスケジューラとは?


Windowsタスクスケジューラ(Task Scheduler)は、特定の時間やイベントの発生時に自動的にスクリプトやプログラムを実行するためのツールです。監視スクリプトをタスクスケジューラに登録することで、一定の間隔で実行し続けることができます。

PowerShellスクリプトの準備


まず、スケジュール実行したいPowerShellスクリプトを作成し、適切な場所に保存します。例えば、C:\Scripts\Monitor.ps1 というスクリプトがあるとします。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$threshold = 80
$logFile = "C:\Logs\cpu_monitor_log.txt"

if ($cpuUsage -gt $threshold) {
    $logEntry = "$(Get-Date) - 警告: CPU使用率が$cpuUsage%を超えました。"
    Add-Content -Path $logFile -Value $logEntry
}

このスクリプトはCPU使用率を監視し、閾値を超えた場合にログを記録します。

タスクスケジューラでPowerShellスクリプトを登録する


以下の手順で、タスクスケジューラにスクリプトを登録し、自動実行させます。

  1. タスクスケジューラを開く
  • Windowsキーを押し、「タスクスケジューラ」と入力し、開きます。
  1. 新しいタスクの作成
  • 右側の「基本タスクの作成」をクリックし、名前を入力(例:「CPU監視スクリプト」)します。
  1. トリガーを設定(実行間隔の設定)
  • 「タスクの開始」で「毎日」または「スケジュール(毎分)」を選択し、適切な時間を指定します。
  • 例えば、「毎5分」で監視したい場合は、「詳細設定」で「繰り返し間隔: 5分」「継続時間: 無期限」と設定します。
  1. 操作の設定(PowerShellスクリプトの実行)
  • 「プログラムの開始」を選択し、「プログラム/スクリプト」に以下を入力:
    powershell powershell.exe
  • 「引数の追加」に以下を入力(スクリプトのフルパスを指定):
    powershell -ExecutionPolicy Bypass -File "C:\Scripts\Monitor.ps1"
  • これにより、PowerShellスクリプトが適切に実行されます。
  1. 完了と確認
  • 設定を保存し、タスクスケジューラの「タスクの一覧」から作成したタスクを右クリック→「実行」を選択してテストします。
  • C:\Logs\cpu_monitor_log.txt にログが記録されていれば成功です。

タスクスケジューラをPowerShellで登録する


GUIを使わず、PowerShellコマンドでタスクを登録することも可能です。以下のスクリプトを実行すると、毎5分ごとにMonitor.ps1を自動実行するタスクが作成されます。

$TaskName = "CPU Monitor Task"
$TaskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File C:\Scripts\Monitor.ps1"
$TaskTrigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5) -RepetitionDuration ([System.TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName $TaskName -Action $TaskAction -Trigger $TaskTrigger -User "NT AUTHORITY\SYSTEM" -RunLevel Highest -Force

このスクリプトを実行すると、タスクスケジューラに新しいタスクが登録され、5分ごとにスクリプトが実行されます。

登録したタスクの確認と削除


登録したタスクを確認するには、以下のコマンドを使用します。

Get-ScheduledTask | Where-Object {$_.TaskName -eq "CPU Monitor Task"}

タスクを削除する場合は、以下のコマンドを実行します。

Unregister-ScheduledTask -TaskName "CPU Monitor Task" -Confirm:$false

これにより、登録したスケジュールタスクが削除されます。

まとめ


タスクスケジューラを活用することで、PowerShellスクリプトを定期的に自動実行し、継続的なパフォーマンスモニタリングが可能になります。GUIで手動設定する方法と、PowerShellスクリプトを使ってタスクを登録・管理する方法を紹介しました。次のセクションでは、実際にCPU使用率を監視し、閾値を超えた場合にログを取得するスクリプトの実践例を解説します。

実践例:CPU使用率監視スクリプトの作成


ここでは、PowerShellを使ってCPU使用率を監視し、一定の閾値を超えた場合にログを取得するスクリプトを作成します。このスクリプトは、一定間隔でCPU使用率を取得し、閾値を超えた場合にログファイルへ記録するシンプルなものです。

基本的なCPU監視スクリプト


以下のスクリプトでは、CPU使用率を取得し、80%を超えた場合にログファイルへ記録します。

# ログファイルのパスを指定
$logFile = "C:\Logs\cpu_monitor_log.txt"

# CPU使用率の閾値を設定
$threshold = 80

# CPU使用率を取得
$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue

# 閾値を超えた場合にログを記録
if ($cpuUsage -gt $threshold) {
    $logEntry = "$(Get-Date) - 警告: CPU使用率が$cpuUsage%を超えました。"
    Add-Content -Path $logFile -Value $logEntry
    Write-Output "ログ記録: $logEntry"
}

このスクリプトを実行すると、CPU使用率が80%を超えた場合にログがC:\Logs\cpu_monitor_log.txtに記録されます。

スクリプトを一定間隔で実行する


上記のスクリプトを定期的に実行するには、whileループを使用して一定の間隔(例:10秒ごと)で監視するようにします。

$logFile = "C:\Logs\cpu_monitor_log.txt"
$threshold = 80

while ($true) {
    $cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue

    if ($cpuUsage -gt $threshold) {
        $logEntry = "$(Get-Date) - 警告: CPU使用率が$cpuUsage%を超えました。"
        Add-Content -Path $logFile -Value $logEntry
        Write-Output "ログ記録: $logEntry"
    }

    # 10秒ごとに監視
    Start-Sleep -Seconds 10
}

このスクリプトを実行すると、CPU使用率が10秒ごとに監視され、閾値を超えた場合のみログが記録されます。

イベントログに記録するスクリプト


Windowsのイベントログ(Event Viewer)に記録したい場合は、以下のスクリプトを使用します。

$threshold = 80

# CPU使用率の取得
$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue

# 閾値を超えた場合にイベントログへ記録
if ($cpuUsage -gt $threshold) {
    $eventMessage = "警告: CPU使用率が$cpuUsage%を超えました。"
    Write-EventLog -LogName Application -Source "PowerShell" -EntryType Warning -EventId 1001 -Message $eventMessage
    Write-Output "イベントログに記録: $eventMessage"
}

このスクリプトを実行すると、WindowsのイベントビューアーApplicationログ)に警告メッセージが記録されます。

メールで通知するスクリプト


閾値を超えた場合に、管理者へメール通知を送信することもできます。以下のスクリプトを使用します。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$threshold = 80

if ($cpuUsage -gt $threshold) {
    $smtpServer = "smtp.example.com"
    $from = "alert@example.com"
    $to = "admin@example.com"
    $subject = "CPU使用率警告"
    $body = "警告: CPU使用率が$cpuUsage%を超えました。"

    Send-MailMessage -SmtpServer $smtpServer -From $from -To $to -Subject $subject -Body $body
    Write-Output "メール送信: $body"
}

このスクリプトを実行すると、CPU使用率が閾値を超えた場合に、管理者宛にメール通知が送信されます。

スクリプトをタスクスケジューラで定期実行


スクリプトを定期的に実行するには、タスクスケジューラを活用します。以下のPowerShellコマンドを使えば、タスクスケジューラに登録できます。

$TaskName = "CPU Monitor Task"
$TaskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File C:\Scripts\Monitor.ps1"
$TaskTrigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5) -RepetitionDuration ([System.TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName $TaskName -Action $TaskAction -Trigger $TaskTrigger -User "NT AUTHORITY\SYSTEM" -RunLevel Highest -Force

このコマンドを実行すると、5分ごとにCPU監視スクリプトが実行されるように設定されます。

応用:CPU、メモリ、ディスクを同時に監視する


CPUだけでなく、メモリやディスクI/Oも同時に監視するには、以下のように複数のパフォーマンスカウンタを取得できます。

$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$memoryUsage = (Get-Counter "\Memory\Available MBytes").CounterSamples.CookedValue
$diskUsage = (Get-Counter "\PhysicalDisk(_Total)\% Disk Time").CounterSamples.CookedValue

$thresholdCpu = 80
$thresholdMemory = 500  # 利用可能メモリが500MB未満なら警告
$thresholdDisk = 90

if ($cpuUsage -gt $thresholdCpu) {
    Write-Output "警告: CPU使用率が$cpuUsage%を超えました。"
}
if ($memoryUsage -lt $thresholdMemory) {
    Write-Output "警告: 利用可能メモリが$memoryUsage MB以下になりました。"
}
if ($diskUsage -gt $thresholdDisk) {
    Write-Output "警告: ディスク使用率が$diskUsage%を超えました。"
}

このスクリプトは、CPU、メモリ、ディスクのリソースを同時に監視し、異常時に警告を出力します。

まとめ


本セクションでは、CPU使用率を監視し、閾値を超えた場合にログを記録するスクリプトを作成しました。さらに、Windowsイベントログへの記録、メール通知の送信、タスクスケジューラでの自動実行、複数のリソース監視などの応用例も紹介しました。次のセクションでは、複数のパフォーマンスカウンタを同時に監視する方法について詳しく解説します。

応用編:複数のパフォーマンスカウンタを監視する方法


これまでの例では、CPU使用率を中心に監視していましたが、システム全体のパフォーマンスを把握するには、複数のリソース(CPU、メモリ、ディスク、ネットワーク)を同時に監視することが重要です。PowerShellのGet-Counterを活用し、複数のカウンタを同時に取得・記録するスクリプトを作成します。

監視対象のパフォーマンスカウンタ


以下の主要なパフォーマンスカウンタを同時に監視します。

監視対象カウンタ名目的
CPU\Processor(_Total)\% Processor TimeCPU使用率を監視
メモリ\Memory\Available MBytes利用可能なメモリ量
ディスク\PhysicalDisk(_Total)\% Disk Timeディスクの使用率
ネットワーク\Network Interface(*)\Bytes Total/secネットワーク帯域使用量

基本的な監視スクリプト


以下のスクリプトでは、CPU、メモリ、ディスク、ネットワークの使用状況を取得し、閾値を超えた場合にログを記録します。

# ログファイルのパスを指定
$logFile = "C:\Logs\system_monitor_log.txt"

# 閾値の設定
$thresholdCpu = 80      # CPU使用率(%)
$thresholdMemory = 500  # 利用可能メモリ(MB)
$thresholdDisk = 90     # ディスク使用率(%)
$thresholdNetwork = 10000000  # ネットワーク使用量(10MB/s)

# パフォーマンスカウンタの取得
$cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
$memoryAvailable = (Get-Counter "\Memory\Available MBytes").CounterSamples.CookedValue
$diskUsage = (Get-Counter "\PhysicalDisk(_Total)\% Disk Time").CounterSamples.CookedValue
$networkUsage = (Get-Counter "\Network Interface(*)\Bytes Total/sec").CounterSamples.CookedValue

# ログを記録
$logEntry = "$(Get-Date) - CPU: $cpuUsage%, メモリ: $memoryAvailable MB, ディスク: $diskUsage%, ネットワーク: $networkUsage Bytes/sec"
Add-Content -Path $logFile -Value $logEntry
Write-Output "ログ記録: $logEntry"

# 閾値を超えた場合のアクション
if ($cpuUsage -gt $thresholdCpu) {
    Write-Output "警告: CPU使用率が$cpuUsage%を超えました。"
}
if ($memoryAvailable -lt $thresholdMemory) {
    Write-Output "警告: 利用可能メモリが$memoryAvailable MB以下になりました。"
}
if ($diskUsage -gt $thresholdDisk) {
    Write-Output "警告: ディスク使用率が$diskUsage%を超えました。"
}
if ($networkUsage -gt $thresholdNetwork) {
    Write-Output "警告: ネットワーク使用量が$networkUsage Bytes/sec を超えました。"
}

このスクリプトを実行すると、各リソースの使用状況がログに記録され、閾値を超えた場合に警告が出力されます。

一定間隔で監視する


システムをリアルタイム監視するには、whileループとStart-Sleepを使用して、10秒ごとに監視するスクリプトを作成します。

$logFile = "C:\Logs\system_monitor_log.txt"
$thresholdCpu = 80
$thresholdMemory = 500
$thresholdDisk = 90
$thresholdNetwork = 10000000

while ($true) {
    # パフォーマンスカウンタを取得
    $cpuUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
    $memoryAvailable = (Get-Counter "\Memory\Available MBytes").CounterSamples.CookedValue
    $diskUsage = (Get-Counter "\PhysicalDisk(_Total)\% Disk Time").CounterSamples.CookedValue
    $networkUsage = (Get-Counter "\Network Interface(*)\Bytes Total/sec").CounterSamples.CookedValue

    # ログを記録
    $logEntry = "$(Get-Date) - CPU: $cpuUsage%, メモリ: $memoryAvailable MB, ディスク: $diskUsage%, ネットワーク: $networkUsage Bytes/sec"
    Add-Content -Path $logFile -Value $logEntry
    Write-Output "ログ記録: $logEntry"

    # 閾値を超えた場合に警告
    if ($cpuUsage -gt $thresholdCpu) { Write-Output "警告: CPU使用率が$cpuUsage%を超えました。" }
    if ($memoryAvailable -lt $thresholdMemory) { Write-Output "警告: メモリ不足 ($memoryAvailable MB)" }
    if ($diskUsage -gt $thresholdDisk) { Write-Output "警告: ディスク使用率高 ($diskUsage%)" }
    if ($networkUsage -gt $thresholdNetwork) { Write-Output "警告: ネットワーク過負荷 ($networkUsage Bytes/sec)" }

    # 10秒間隔で監視
    Start-Sleep -Seconds 10
}

このスクリプトを実行すると、10秒ごとにリソースの状態を監視し、ログを記録しつつ、閾値超過時に警告を出力します。

イベントログに記録する


Windowsのイベントビューアーに記録する場合は、Write-EventLogを使用します。

if ($cpuUsage -gt $thresholdCpu) {
    Write-EventLog -LogName Application -Source "PowerShell" -EntryType Warning -EventId 1002 -Message "CPU使用率が$cpuUsage%を超えました。"
}

このスクリプトを実行すると、WindowsのアプリケーションイベントログにCPU過負荷の警告が記録されます。

タスクスケジューラで自動実行


このスクリプトをタスクスケジューラで定期実行するには、以下のコマンドを使用します。

$TaskName = "System Monitor Task"
$TaskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File C:\Scripts\SystemMonitor.ps1"
$TaskTrigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5) -RepetitionDuration ([System.TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName $TaskName -Action $TaskAction -Trigger $TaskTrigger -User "NT AUTHORITY\SYSTEM" -RunLevel Highest -Force

このコマンドを実行すると、5分ごとにスクリプトが実行されるようになります。

まとめ


本セクションでは、CPU、メモリ、ディスク、ネットワークの複数のパフォーマンスカウンタを同時に監視する方法を解説しました。さらに、リアルタイム監視、イベントログ記録、タスクスケジューラによる自動実行の方法も紹介しました。

次のセクションでは、これまでの内容をまとめ、本記事のポイントを振り返ります。

まとめ


本記事では、PowerShellを活用したWindowsのパフォーマンスモニタリングの自動化について解説しました。CPU使用率、メモリ消費量、ディスクI/O、ネットワークトラフィックなどのシステムリソースを監視し、閾値を超えた場合にログを取得する方法を紹介しました。

特に以下の内容を詳しく解説しました:

  • Get-Counterを使用したパフォーマンスカウンタの取得
  • 閾値を設定し、CPU使用率などの異常を検知する方法
  • ログをテキスト、CSV、JSON、Windowsイベントログに記録する方法
  • メール通知を送信する方法
  • タスクスケジューラを利用し、スクリプトを定期実行する方法
  • 応用編として、CPU、メモリ、ディスク、ネットワークを同時に監視するスクリプトの作成

PowerShellを活用することで、システムの異常を迅速に検知し、ログ取得や通知を自動化できます。定期的な監視と適切なアラート設定を行うことで、Windowsの安定運用を実現できます。

今後は、取得したログを可視化する方法(Excel、Grafanaなどのツールを活用)や、アラートの詳細な分析方法を学ぶことで、より高度な監視システムを構築できます。PowerShellを活用して、より効率的なシステム管理を実践してください。

コメント

コメントする

目次