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

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.201 信頼性モニター、使わないのはもったいない|セイテク・シス管道場(Web)

 

 

vol.201 信頼性モニター、使わないのはもったいない|セイテク・シス管道場(Web)

2026年05月14日配信
2026年05月14日更新
執筆者:山内 和朗

 「セイテク・シス管道場(Web)」では、Windows Serverの要素技術やシステム管理の基本的な部分に焦点を当てたいと思います。今回は古くからあるツールなのに、知っている人が少ないかもしれない「信頼性モニター(Reliability Monitor)」に注目します。

 

システムの安定性を視覚的に確認できる「信頼性モニター」

 「信頼性モニター」は、Windows Vistaで「パフォーマンスモニター」(perfmon.exe、perfmon.msc)の一部として初めて登場し(当時の名称は「信頼性とパフォーマンスモニタ」《音引なし》)、Windows 7およびWindows Server 2008 R2で現在の形、つまり、「セキュリティとメンテナンス」(Windows 8.1およびWindows Server 2012 R2以前はアクションセンター)コントロールパネルから起動するようになりました(画面1)。Windows Vistaの当時から変わらず、「perfmon /rel」ですばやく起動することができるので、それを知っている人ならお馴染みのツールです。しかし、Microsoftはコントロールパネルへの依存を減らしていく方向ですし、コントロールパネルの深い位置にあることや、その場所の名称変更もあって、その存在自体を知らないという人もいるのではないでしょうか。

 

画面1 コントロールパネルの深い位置(コントロールパネル > システムとセキュリティ > セキュリティとメンテナンス > 問題の報告 > 信頼性履歴の表示)にある「信頼性モニター」。「perfmon /rel」を知っていると便利
画面1 コントロールパネルの深い位置(コントロールパネル > システムとセキュリティ > セキュリティとメンテナンス > 問題の報告 > 信頼性履歴の表示)にある「信頼性モニター」。「perfmon /rel」を知っていると便利

 信頼性モニターは、システムの安定性インデックスを、過去1か月間、1時間ごとに1~10のスコア(小数あり)で評価し、各信頼性スコア(計720+α)の悪化または改善に影響を与えたアプリケーションエラー、Windowsエラー、その他のエラー、警告、情報(Windows Updateやアプリケーションのインストール、アンインストール)イベントを関連付けて報告します。特に、Windows PCを使用しているユーザーは、最近PCの調子がおかしいと思ったら、この信頼性モニターを確認することで、システムの安定性が悪化した時期やその原因(例えば、Windows Updateによる更新プログラムのインストール、ハードウェアエラーなど)を調査することができます。イベントビューアーを開いてイベントログに記録される膨大なイベントから問題の原因や予兆を探すよりも、信頼性モニターを開いて信頼性インデックスが悪化した時期と関連するイベントを調べたほうが効率的です。

 信頼性モニターの存在は知っていても、その情報にWMI(Windows Management Instrumentation)経由でアクセスできることを知っている人は少ないでしょう。以下のWMIクラスは、信頼性スコアとスコアに影響を与えたイベントを提供します。これらのWMIクラスは、信頼性モニターが現在の形になった、Windows 7およびWindoows Server 2008 R2から利用可能です。

Win32_ReliabilityStabilityMetrics class|ReliabilityMetricsProvider Provider(Microsoft Learn)
Win32_ReliabilityRecords class|ReliabilityMetricsProvider Provider(Microsoft Learn)

参考:
Use PowerShell to Gauge the Reliability of Your Windows 7 Computer|Dev Blogs > Scripting Blog [archived](Microsoft)

 

信頼性モニターは、現在サポートされているWindows、およびWindows Serverデスクトップエクスペリエンスで利用可能です。Server Coreインストールでは「信頼性モニター」コントロールパネルおよび関連WMIクラスは利用できません。

 

PowerShellで信頼性モニターの有益な情報を使い倒す

 

 PowerShell(Windows PowerShell《powershell.exe》またはPowerShell《pwsh.exe》)を使用して、信頼性モニターが提供する安定性インデックスの情報と、関連するイベントを抜き出してみましょう。

 次のコードを実行すると、過去1か月、1時間ごと安定性インデックスの値(計720+αの値)の増減を、テキストベースの棒グラフにして表示します(画面2)。

 

$rels = Get-CimInstance -ClassName Win32_ReliabilityStabilityMetrics |
    Sort-Object TimeGenerated
foreach ($rel in $rels){
  $val = [math]::Round($rel.SystemStabilityIndex * 2)
  $bar = ("▮" * $val) + ("▯" * (20 - $val))
  Write-Host  ($rel.TimeGenerated).ToString("yyyy/MM/dd HH:mm") -NoNewLine
  Write-Host "  $($bar) ($($rel.SystemStabilityIndex.ToString("00.00")))"
} 


画面2 Win32_ReliabilityStabilityMetricsクラスから1時間ごとの安定性インデックスの値を取得し、棒グラフ化する(▮は0.5)
画面2 Win32_ReliabilityStabilityMetricsクラスから1時間ごとの安定性インデックスの値を取得し、棒グラフ化する(▮は0.5)

 次のコードを実行すると、Win32_ReliabilityStabilityMetricsクラスから、もっとも古いスコア(-First 1)と最も新しいスコア(-Last 1)の信頼性インデックス(SystemStabilityIndex)とその日時(TimeGenareted)、計測開始日時(StartMeasurementDate)、計測終了日時(EndMeasurementDate)を取得し、最後に、期間中の平均、最大、最小の信頼性インデックスを計算して示します(画面3)。

 

$rels = Get-CimInstance Win32_ReliabilityStabilityMetrics
$rels | Sort TimeGenerated | Select -First 1 |
  Select TimeGenerated, StartMeasurementDate, EndMeasurementDate, SystemStabilityIndex

$rels | Sort TimeGenerated | Select -Last 1 |
  Select TimeGenerated, StartMeasurementDate, EndMeasurementDate, SystemStabilityIndex

$stats = $rels | Measure-Object SystemStabilityIndex -Average -Maximum -Minimum
"AVG {0:N2}  MAX {1:N2}  MIN {2:N2}" -f $stats.Average,$stats.Maximum,$stats.Minimum 

 

画面3 Win32_ReliabilityStabilityMetricsクラスから、期間中の信頼性インデックスのスコアの最古、最新、および集計(平均、最大、最小)値を取得する
画面3 Win32_ReliabilityStabilityMetricsクラスから、期間中の信頼性インデックスのスコアの最古、最新、および集計(平均、最大、最小)値を取得する

 続いて、次のコードを実行すると、期間中の最も悪化した信頼性インデックスの計測開始日時と計測終了日時を取得し、Win32_ReliabilityRecordsクラス経由でその期間(1時間)に記録されたイベントを列挙します(画面4)。
 

$lowscore = $rels | Where-Object {$_.SystemStabilityIndex -eq $stats.Minimum}
$records = Get-CimInstance -ClassName Win32_ReliabilityRecords |
  Where-Object {($_.TimeGenerated -ge  $lowscore.StartMeasurementDate)
    -and ($_.TimeGenerated -lt $lowscore.EndMeasurementDate)} | Sort-Object TimeGenerated

$records |Select TimeGenerated, EventIdentifier,LogFile,Message | Format-Table 

 

画面4 信頼性インデックスが最も低かった期間に記録された関連イベントを表示する

画面4 信頼性インデックスが最も低かった期間に記録された関連イベントを表示する

 Win32_ReliabilityRecordsクラスで取得できる情報には、重大、エラー、警告、情報などのイベントレベルが含まれません。イベントの情報には、ログ(LogFile)、イベントID(EventIdentifier)、レコード番号(RecordNumber)が含まれるので、イベントレベルはイベントログを調べれば分かります。イベントログの情報は、Get-WinEventコマンドレットで取得できます。

 次のコードを実行すると、先ほど取得した安定性インデックス最低時のイベントを、イベントログと突き合わせ詳細情報として表示します(画面5)。
 

foreach ($record in $records) {
    $event = Get-WinEvent -FilterHashtable @{
        LogName = $record.LogFile
        Id      = $record.EventIdentifier
    } -ErrorAction SilentlyContinue |
      Where-Object { $_.RecordId -eq $record.RecordNumber } |
      Select-Object -First 1
      [PSCustomObject]@{
          TimeGenerated    = $record.TimeGenerated
          SourceName       = $record.SourceName
          EventID          = $record.EventIdentifier
          LogFile          = $record.LogFile
          LevelDisplayName = $event.LevelDisplayName
          Message          = $record.Message
      }
} 

 

画面5 Win32_ReliabilityRecordsクラスからの情報を、イベントログと突き合わせて、イベントレベルを含むイベントの詳細情報を取得する
画面5 Win32_ReliabilityRecordsクラスからの情報を、イベントログと突き合わせて、イベントレベル(重大、エラー、警告、情報)を含むイベントの詳細情報を取得する

 次のコードを実行すると、過去1か月間に記録されたイベントを、イベントソースでグループ化して、そのトップ10を列挙します。良くも悪くも、Microsoft-Windows-WindowsUpdateClientがトップ1に輝くでしょう。悪くもとは言いすぎました。決して、Windows Updateに問題が多いというわけではありません。WindowsやMicrosoft Storeアプリのインストール履歴が情報イベントとして記録されるので、当然、上位にきます。

 

$records = Get-CimInstance Win32_ReliabilityRecords
$records | Group-Object SourceName | Sort-Object Count -Descending | Select-Object -First 10 Count, Name |
Format-Table -AutoSize 

 

 次のコードを実行すると、過去1か月に記録されたイベントから、Microsoft Defender Antivirusを除く、Windows Updateのイベントを列挙します。Windows Updateだけでなく、ストアアプリの更新履歴を含めて確認できるのは珍しいかもしれません(画面6)。
 

$records = Get-CimInstance Win32_ReliabilityRecords
$records | Where { ($_.SourceName -like "*WindowsUpdateClient*")
  -and ($_.ProductName -notmatch "Microsoft Defender Antivirus")} |
  Select TimeGenerated, Message |Format-Table -Wrap 

 

画面6 信頼性インデックスのスコアに影響を与えたイベントソースのトップ10と、Windows Update関連イベントの列挙

画面6 信頼性インデックスのスコアに影響を与えたイベントソースのトップ10と、Windows Update関連イベントの列挙

 

信頼性モニターの最新情報だけを返すスクリプト

 

 次のPowerShellスクリプト「relreport.ps1」は、直近2回の安定性インデックスのスコアを取得し、その増減を→↑↓で示し、関連するイベントがあればそれを表示します。また、必要であれば、先ほど示したのと同じテクニックを用いてイベントの詳細情報を出力します(画面7)。


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

$last2rel = Get-CimInstance -ClassName Win32_ReliabilityStabilityMetrics |
    Sort-Object TimeGenerated |
    Select-Object -Last 2

$time0 = $last2rel[0].TimeGenerated
$time1 = $last2rel[1].TimeGenerated

$rel0 = $last2rel[0].SystemStabilityIndex
$rel1 = $last2rel[1].SystemStabilityIndex

switch ($rel1 - $rel0) {
    {$_ -gt 0} { $arrow = "↑"; break }
    {$_ -eq 0} { $arrow = "→"; break }
    {$_ -lt 0} { $arrow = "↓"; break }
}

$outstr = "安定性指標:`n`n"
$outstr += "{0,-16}  {1,-16}" -f $time0.ToString("yyyy/MM/dd HH:mm"), $time1.ToString("yyyy/MM/dd HH:mm")
$outstr += "`n----------------  ----------------`n"
$outstr += "{0,16:N2}  {1,14:N2} {2}" -f $rel0, $rel1, $arrow

$eventime0 = $last2rel[1].StartMeasurementDate
$eventime1 = $last2rel[1].EndMeasurementDate
$records = Get-CimInstance -ClassName Win32_ReliabilityRecords |Where-Object {($_.TimeGenerated -ge $eventime0) -and ($_.TimeGenerated -lt $eventime1)} | Sort-Object TimeGenerated

$outstr |Out-Host

if ($records.Count -eq 0) {
  "`n`nイベント:`n信頼性に関連するログは記録されていません。"
} else {
  "`n`nイベント:"
  $records |Select-Object TimeGenerated, @{Name="EventId"; Expression={$_.EventIdentifier}}, LogFile, Message |Out-Host
  $answer = Read-Host "イベントの詳細を表示しますか? (Y/N)"
  if ($answer.ToUpper() -eq "Y") {
    $results = foreach ($record in $records) {
    $event = Get-WinEvent -FilterHashtable @{
        LogName = $record.LogFile
        Id      = $record.EventIdentifier
    } -ErrorAction SilentlyContinue |
      Where-Object { $_.RecordId -eq $record.RecordNumber } |
      Select-Object -First 1
      [PSCustomObject]@{
          TimeGenerated    = $record.TimeGenerated
          SourceName       = $record.SourceName
          EventID          = $record.EventIdentifier
          LogFile          = $record.LogFile
          LevelDisplayName = $event.LevelDisplayName
          Message          = $record.Message
      }
    }
    Foreach($result in $results) {
      $result
      Read-Host "Enterキーで次へ"
    }
    "(終了)"
  }
}

 

画面7 直近の信頼性モニターの情報を取得するスクリプト

画面7 直近の信頼性モニターの情報を取得するスクリプト

 

 最後に、信頼性インデックスのスコアを意図的に悪化させたい(信頼性モニターの挙動をテストしたいなど)なら、PowerShellで次のコードを実行してみてください。アプリケーションエラーが記録され、次の1時間の信頼性インデックスのスコアが低下するはずです。Windows SysinternalsのNotMyFaultを使用して、STOPエラーを発生させれば、さらに悪化するでしょう。

 

 [System.Environment]::FailFast("Test Crash") 

 

NotMyFault|Sysinternals(Microsoft Learn)

 

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

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事