system resourceの短時間monitoringで最初に求められるのはcommand暗記ではなく、何を正しい結果とするかの定義です。結論は「Get-Counterへ複数counterを一度に渡し、SampleIntervalとMaxSamplesで上限を設けます。CPU平均とmemory commitを別指標として保存し、単発の高値で障害と断定しません。」。CPU、memory、disk、networkを同一sampling windowで読み、無限loopやexecution policy変更を不要にすることを確認し、表示、加工、変更を混同しない順序で進めます。
CPU・memory・diskのcounter pathを確認する
システム資源監視は、CPU、利用可能メモリー、ディスク待ち時間など目的に直結するカウンターを少数選び、サンプル間隔と観測時間を明記します。Get-Counterで各パスの有効性を先に確認し、欠測値をゼロへ置換しません。Timestampごとの平均と最大を計算し、単発のピークと継続的な逼迫を分けます。
- Get-Counter -ListSetでlocal counter名を確認する
- sampling期間と業務workloadを確認する
- output fileの容量・ACL・rotationを決める
- remote監視は既存管理channelと権限を使う
一分以内のbounded samplingを設計する
主要counterを一回取得
Get-Counter '\Processor(_Total)\% Processor Time','\Memory\% Committed Bytes In Use','\PhysicalDisk(_Total)\% Disk Time' |
Select-Object -ExpandProperty CounterSamples | Select-Object Path,CookedValue,Timestamp
同じ呼出しで時刻差を小さくします。
一分間の上限付き測定
$data=Get-Counter '\Processor(_Total)\% Processor Time','\Memory\% Committed Bytes In Use' -SampleInterval 5 -MaxSamples 12
無期限monitorではなく調査windowを固定します。
counter別統計
$data.CounterSamples | Group-Object Path | ForEach-Object { [pscustomobject]@{Path=$_.Name;Average=($_.Group.CookedValue|Measure-Object -Average).Average;Maximum=($_.Group.CookedValue|Measure-Object -Maximum).Maximum} }
平均だけでspikeを失わないようmaximumも残します。
CSVへ保存
$data.CounterSamples | Select-Object Timestamp,Path,InstanceName,CookedValue | Export-Csv '.\resource-sample.csv' -NoTypeInformation -Encoding utf8
新規名と限定ACLを使います。
process上位を同時刻確認
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 ProcessName,Id,CPU,WorkingSet64
CPUは累積秒なのでcounter percentと混同しません。
Path別に平均・最大・sample数を集計する
CPU percentはsampling、memory commitはphysical memory使用率と異なり、disk timeはstorage stackやdeviceにより100を超える解釈もあります。counterごとの単位とinstanceを記録し、平均、maximum、継続時間を見ます。Task Managerの表示と比較する際はsampling intervalと指標を合わせます。
raw sampleをlong CSVへ保存する
- Set-ExecutionPolicyを前提にする
- 単発値を継続高負荷とする
- counterのlocal language差を無視する
- memory指標を混同する
- 無限loopでlogを増やす
同時刻のprocess上位を補足する
監視は読み取りですが、短いinterval、多数counter、全process詳細、無期限fileは負荷と情報漏えいを招きます。ExecutionPolicy変更は不要です。sample上限、timeout、file上限を設定し、disk不足時はmonitor出力を止めます。監視のためsecurity機能やserviceを停止しません。
localized counterとmissing instanceを検出する
Performance MonitorやTask Managerと同一windowで傾向を照合し、idleと既知loadで値が変化することを確認します。CSV件数はcounter数×sample数と比較し、欠測、NaN、access errorを別に数えます。
time window・Status・sample数で検収する
Get-CounterでCPU、committed memory、diskを同じSampleInterval/MaxSamplesで取り、CounterSamplesをPath別に平均・最大・欠損数へ集計します。単発spikeと継続高負荷を分け、Get-Process snapshotは原因候補の同時刻補足にします。
三resourceを五回sampleして統計化する
$paths='\Processor(_Total)\% Processor Time','\Memory\% Committed Bytes In Use','\PhysicalDisk(_Total)\% Disk Time'
$d=Get-Counter $paths -SampleInterval 2 -MaxSamples 5 -ErrorAction Stop
$d.CounterSamples | Group-Object Path | ForEach-Object { [pscustomobject]@{Path=$_.Name;Samples=$_.Count;Average=[math]::Round(($_.Group.CookedValue|Measure-Object -Average).Average,2);Maximum=[math]::Round(($_.Group.CookedValue|Measure-Object -Maximum).Maximum,2)} }
counter欠損を採取失敗とStatusで識別する
- 全resourceを採取:各counterに予定sample数があり、CookedValueの平均/最大とtimestamp範囲を計算できる
- counter未提供:counter 0件/unsupportedはUnknownとして監視正常に置換しない
- sampling・保存error:PDH status、NaN、localized path、CSV write errorはcounter別Errorにする
% Disk Timeがstorage latencyそのものとは限らず、CPU averageだけで短いsaturationを隠しません。英語counter名が無いhostはGet-Counter -ListSetでlocal名を確認し、IIS tuning資料を一般Windows counter定義の根拠にしません。
idle・短いspike・instance消失を試す
Get-Counter -ListSet 'Processor*','Memory','PhysicalDisk' -ErrorAction SilentlyContinue | Select-Object CounterSetName,PathsWithInstances
idle、短いspike、継続load、counter欠損、localized OSをtestします。予定/実sample数、平均/max、NaN、同時刻top process、counter set名を保存します。
単一snapshotから恒常的な高負荷を断定しません。sample間隔と回数を固定し、平均と最大、同時刻process、CounterSamples.Statusを同じ調査窓で比較します。

コメント