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

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.208 システムインサイトによる容量予測|セイテク・シス管道場(Web)

 

 

vol.208 システムインサイトによる容量予測|セイテク・シス管道場(Web)

2026年06月08日配信
執筆者:山内 和朗

 「セイテク・シス管道場(Web)」では、Windows Serverの要素技術やシステム管理の基本的な部分に焦点を当ててきました。今回は、Windows Server 2019から利用可能になった比較的新しいサーバーの機能「システムインサイト(System Insights)」について取り上げます。

※5/20開催セミナーのアーカイブビデオの視聴が可能になりました。
【アーカイブ】セイテク・シス管道場 第7回 Windows Server パフォーマンス監視の基本と新常識~正しく測る、正しく判断するための実践ポイント~

 

システムインサイトとは、その機能と使い方

 

 Windows Server 2019から利用可能になったサーバーの機能「システムインサイト(System Insights)」は、 機械学習モデルを使用したローカルシステムデータの予測分析を提供し、サーバーリソース(CPU、ネットワーク、ストレージ、ボリューム)を事前に予測および管理できるようにするものです。その機能と管理方法については以下のドキュメントで説明されていますが、無料のWebベースの管理アプリ「Windows Admin Center(WAC)(v2)」を利用すれば、簡単なクリック操作で有効化でき、すぐに最初の結果を確認することができます(画面1)。

System Insights とは|Windows Server(Microsoft Learn)
機能の管理|Windows Server(Microsoft Learn)

 

画面1 WAC(v2)でサーバーの「システムインサイト」を有効化すると、1日1回予測を取得し、向こう1か月先までの容量の予測を確認できる
画面1 WAC(v2)でサーバーの「システムインサイト」を有効化すると、1日1回予測を取得し、向こう1か月先までの容量の予測を確認できる

 システムインサイトを有効にすると、次の4つの予測を取得する機能が既定で有効になり、1日1回(既定でAM3:00)に予測を取得するようにスケジューリングされます。

 

  • CPU capacity forecasting ・・・ CPU使用率を計測し、1か月先までの使用率を予測
  • Networking capacity forecasting ・・・ 各ネットワークアダプターのネットワーク使用量を計測し、1か月先までの使用量を予測
  • Total storage consumption forecasting ・・・ すべてのローカルドライブ全体のストレージ使用量の合計を計測し、1か月先までの使用量を予測
  • Volume consumption forecasting ・・・ ボリュームごとのストレージ使用量を計測し、1か月先までの使用量を予測
    公式ドキュメントでは、入力データが6~180日では予測の長さは入力データの1/3、入力データが180~365日では予測の長さは60日となっていますが、Windows Server 2025では367日で取得できる予測は30日でした(仕様が30日に変更されたか、内部的に60日の予測データがあってGet-InsightsCapabilityResultが30日分しか返せないのかもしれません)。


 システムインサイトはPowerShellだけで有効化し、その機能を利用することもできます。次のコマンドラインを実行すると、システムインサイトに必要な機能を有効化し、初回の予測取得を実行(Invoke-InsightsCapability)して、その結果を取得(Get-InsightsCapabilityResult)できます。予測には少なくとも6日以上のデータ取得が必要です。最後コマンドライン(Get-InsightsCapabilitySchedule)は実行スケジュールの確認です(画面2、画面3)。予測結果は、測定回数が増すごとにその精度も増していきます。
 

Install-WindowsFeature -Name 'System-Insights','RSAT-System-Insights', 'System-DataArchiver'
Get-InsightsCapability
Get-InsightsCapability | Invoke-InsightsCapability
Get-InsightsCapability | Get-InsightsCapabilityResult
Get-InsightsCapability | Get-InsightsCapabilitySchedule 

 
 画面2 WAC(v2)を使用せずに、PowerShellだけでシステムインサイトを有効化する。既定で4つの機能が有効になっているが、初回の予測取得を実行するにはInvoke-InsightsCapabilityコマンドレットを実行する
画面2 WAC(v2)を使用せずに、PowerShellだけでシステムインサイトを有効化する。既定で4つの機能が有効になっているが、初回の予測取得を実行するにはInvoke-InsightsCapabilityコマンドレットを実行する

 

画面3 予測結果はGet-InsightsCapabilityResultコマンドレットで、既定の実行スケジュールはGet-InsightsCapabilityScheduleコマンドレットで確認可能
画面3 予測結果はGet-InsightsCapabilityResultコマンドレットで、既定の実行スケジュールはGet-InsightsCapabilityScheduleコマンドレットで確認可能

 アプリケーションとサービスログの「Microsoft-Windows-System-Insights/Admin」に、イベントID 151、150、149、148、132(それぞれOk、Critical、Error、Warning、None)のイベントとして予測結果が記録されます。例えば、PowerShellで次のコマンドラインを実行すれば、Ok以外の予測結果が出ていないかどうかをすばやく確認できます。

 

Get-WinEvent -FilterHashtable @{
    LogName = "Microsoft-Windows-System-Insights/Admin"
    Id      = 132, 148, 149, 150
} | Select-Object TimeCreated, Id, LevelDisplayName, Message 

 

 予測が使用可能な予測を超えない場合はOk、今後30日間で使用可能な容量を超える場合は警告(Warning)、今後7日間で使用可能な容量を超える場合は重大(Critical)のイベントが記録されます。データが不足している場合はなし(None)のイベントが記録されます。Set-InsightsCapabilityActionコマンドレットを使用すると、Ok、Critical、Error、Warning、Noneのイベント発生に対して、通知や修復アクションを実行させるようにPowerShellスクリプトを設定することもできます(画面4)。

 

# アクションの設定(例、Warningイベント時)
$cred = Get-Credential
Set-InsightsCapabilityAction -Name "機能名" -Type Warning -Action "C:\Scripts\actionscript.ps1" `
  -ActionCredential $Cred

# アクションの削除するには(例、Warningイベント時)
Remove-InsightsCapabilityAction -Name "機能名" -Type Warning

 

画面4 システムインサイトのOk、Critical、Error、Warning、Noneイベント発生時にPowerShellスクリプトを自  実行させ、通知や修復タスクを自動実行できる

画面4 システムインサイトのOk、Critical、Error、Warning、Noneイベント発生時にPowerShellスクリプトを実行させ、通知や修復タスクを自動実行できる

 

 PowerShellだけでシステムインサイトの収集/予測データを見る 


 WAC(v2)の「システムインサイト」拡張を利用すれば、履歴および予測データをグラフで確認することができますが、PowerShellの場合、どこまでできるでしょうか。次のコマンドラインを実行すると、最新または過去30日(-History)の予測の状態の履歴を確認できます。しかし、WAC(v2)で確認できるグラフのデータはこのコマンドレット(Get-InsightsCapabilityResult)では確認できません(画面5)。

Get-InsightsCapabilityResult -Name "機能名"
Get-InsightsCapabilityResult -Name "機能名" -History 

 

画面5 Get-InsightsCapabilityResultコマンドレットでは過去30日の予測の状態は確認できるが、CPU使用率などの詳細な履歴データ、予測データは取得できない
画面5 Get-InsightsCapabilityResultコマンドレットでは過去30日の予測の状態は確認できるが、CPU使用率などの詳細な履歴データ、予測データは取得できない

 詳細な履歴および予測データは、(Get-InsightsCapabilityResult -Name "機能名").Outputで取得できる、機能ごとの最新のJSONファイルに格納されていました。このJSONファイルには、過去1年間の履歴データと30日間の予測データが保持されています。なお、-Historyで過去30日の履歴を確認できるといいましたが、それぞれに過去1年の履歴と30日の予測データを含むJSONファイルが紐づいており、常に30のJSONファイルが保持されるようになっているようです。言い換えれば、毎日1回のスケジュール実行で新たなJSONファイルが作成され、最古のJSONファイルが削除されるということです。そして、予測は最大で過去1年分の履歴データに基づいたものになります。このあたりのログ管理は完全にシステムインサイトの自動管理に任せることができるので、ログ管理について心配する必要はありません。

 JSONファイルをConvertFrom-Jsonコマンドレットで変換して確認すると、ForecastingResults.ObservationSeriesに過去1年の履歴データ、ForecastingResults.Predictionに向こう30日の予測データを確認できました(画面6)。

 

画面6 最新のJSONファイルを解析すると、過去1年の履歴データと向こう30日の予測データを確認できた
画面6 最新のJSONファイルを解析すると、過去1年の履歴データと向こう30日の予測データを確認できた

 この結果を踏まえて、4つのすべての機能(CPU、ネットワーク、ストレージ、ボリューム)について、最大過去1年の履歴データの平均、最大、最小と、向こう30日の予測の平均、最大、最小値を取得するPowerShellスクリプトを書いてみました(画面7)。予測値は平均、最大、最小値よりも、年月日と数値で30日分列挙したほうが分かりやすいかもしれません(サンプル)。なお、このスクリプトは、実行対象のサーバーでシステムインサイトが有効になっており、すべての機能が有効で長期間運用中の場合を想定しています。

プレーンテキストで表示、ダウンロード、詳細な予測結果を含むコードはこちら

$capabilities = @(
  "CPU capacity forecasting",
  "Networking capacity forecasting",
  "Total storage consumption forecasting",
  "Volume consumption forecasting"
)

foreach ($capability in $capabilities){
  $Output = Get-Content (Get-InsightsCapabilityResult -Name $capability).Output -Encoding UTF8 | ConvertFrom-Json
  $Output.ForecastingResults | ForEach-Object {
    $values = $_.ObservationSeries | ForEach-Object { $_.Values[0] }
    $stats = $values | Measure-Object -Average -Maximum -Minimum
    [PSCustomObject]@{
        Resource  = $_.IdentifierFriendlyName + ": 実績"
        Average = [math]::Round($stats.Average, 2)
        Maximum = [math]::Round($stats.Maximum, 2)
        Minimum = [math]::Round($stats.Minimum, 2)
    }
  }
  $Output.ForecastingResults | ForEach-Object {
    $values = $_.Prediction | ForEach-Object { $_.Values[0] }
    $stats = $values | Measure-Object -Average -Maximum -Minimum
    [PSCustomObject]@{
        Resource  = $_.IdentifierFriendlyName + ": 予測"
        Average = [math]::Round($stats.Average, 2)
        Maximum = [math]::Round($stats.Maximum, 2)
        Minimum = [math]::Round($stats.Minimum, 2)
    }
  }
}

 

画面7 システムインサイトの履歴データ、予測データをPowerShellで集計
画面7 システムインサイトの履歴データ、予測データをPowerShellで集計

 

 セイテク・シス管道場(Web) (1) (2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)|(16)   

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事