0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

パフォーマンスカウンタのProcessっぽいデータを「コマンドライン」付で取得

Last updated at Posted at 2024-10-18

システムのパフォーマンスを分析したいときに、パフォーマンスカウンタを仕掛けるのはよくあることだと思います。
で、Processの情報を取得するときに、同じ名前のプロセスが複数上がっていて、どれが目的のものか判別できなくて困ることありますよね。

調べてみたら、PowershellのCimInstanceを使うことで、タスクマネージャのコマンドライン列相当のデータをつけて、類似のデータを採取できるみたいです。起動時の引数などで目的のプロセスが判別できるなら、これで解決するかも。

以下の状況において
image.png

パフォーマンスカウンタだと、以下のように判別ができないので
image.png

以下のように「コマンドライン」付のログをPowershellで取る感じです
image.png

簡単に採取スクリプトを組んでみたので、サンプルとして残しておきます。
冒頭の「取得対象のプロセスの名前」~「サンプリング対象」あたりを、目的に応じて書き換えて使用する想定です。

ProcessInfoLogger.ps1

# 取得対象のプロセスの名前
$targetProcessName = "cmd.exe"

# 出力ファイル
$outFileName = "D:\work\out.csv"

# サンプル間隔(秒)
$samplingTime = 15

# サンプリング対象 (取得するものをコメントアウト)
$samplingProperties = @(
    "ProcessName"
    # ,"Handles"
    # ,"VM"
    # ,"WS"
    # ,"Path"
    # ,"Caption"
    # ,"Description"
    # ,"InstallDate"
    # ,"Name"
    # ,"Status"
    # ,"CreationClassName"
    ,"CreationDate"
    # ,"CSCreationClassName""
    # ,"CSName"
    # ,"ExecutionState"
    # ,"Handle"
    ,"KernelModeTime"
    # ,"OSCreationClassName"
    # ,"OSName"
    # ,"Priority"
    # ,"TerminationDate"
    ,"UserModeTime"
    ,"WorkingSetSize"
    ,"CommandLine"
    # ,"HandleCount"
    # ,"MaximumWorkingSetSize"
    # ,"MinimumWorkingSetSize"
    # ,"OtherOperationCount"
    # ,"OtherTransferCount"
    # ,"PageFaults"
    # ,"PageFileUsage"
    # ,"ParentProcessId"
    # ,"PeakPageFileUsage"
    # ,"PeakVirtualSize"
    # ,"PeakWorkingSetSiz"
    # ,"PrivatePageCount"
    ,"ProcessId"
    # ,"QuotaNonPagedPoolUsage"
    # ,"QuotaPagedPoolUsage"
    # ,"QuotaPeakNonPagedPoolUsage"
    # ,"QuotaPeakPagedPoolUsage"
    # ,"ReadOperationCoun"
    # ,"ReadTransferCount"
    # ,"SessionId"
    # ,"ThreadCount"
    ,"VirtualSize"
    # ,"WindowsVersion"
    # ,"WriteOperationCount"
    # ,"WriteTransferCount"
    # ,"PSComputerName"
)



# メッセージ
Write-Host "プロセス情報採取中。。。"

# 主処理
while ($true) {
    # サンプル時刻とプロセス情報を取得
    $sampledTime = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
    $cimInstanceProcess = Get-CimInstance -ClassName win32_process -Filter "name = '$targetProcessName'" 

    # 全部出力するとファイル容量が大きくなるので、必要なものだけに絞って出力データ($outData)に入れる
    $outData = @()
    foreach ($process in $cimInstanceProcess ) {

        # サンプル時刻を入力しつつ$outDataRecordを初期化
        $outDataRecord = [PSCustomObject]@{
            SampledTime = $sampledTime
        }

        #プロセスの情報を$outDataRecordに追加
        foreach ($property in $samplingProperties){
            $outDataRecord | Add-Member -MemberType NoteProperty -Name $property -Value $process.($property)
        }

        # $outDataRecordを$outDataに追加
        $outData += $outDataRecord
    }

    # 出力
    $outData | Export-Csv -Path $outFileName -NoTypeInformation -Encoding Default -Append

    # 待ち合わせ
    Start-Sleep $samplingTime
}


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?