A különféle hálózati kártyák teljesítményadatainál könnyű volt a dolgunk, hiszen a nevük különböző, így egyértelműen tudhatjuk, hogy melyik számláló melyik hálózati kártyához tartozik. Azonban a processzek esetében nem ilyen könnyű a dolgunk, hiszen egy processz több példányban is futhat:
PS C:\> $proccounters = Get-Counter -ListSet process
PS C:\> $proccounters.PathsWithInstances -match "\(powershell\)\\% Processor Ti
me"
\Process(powershell)\% Processor Time
\Process(powershell)\% Processor Time
A fenti példában látható, hogy két ugyanolyan powershell processzhez tartozó % Processor Time számláló van. Hogyan tudjuk, hogy melyik melyikhez tartozik? Hogyan tudjuk célzottan a nekünk érdekes számlálót lekérdezni? Nem is olyan egyszerű ez, de szerencsére nem lehetetlen. A segítséget a Performance Monitor alkalmazás adja meg:
125 . ábra A két különböző PowerShell processz megkülönböztetése
Láthatjuk, hogy az ismétlődéseknél a Performance Monitor a #sorszám toldalékot teszi az egyes példányokhoz. De ettől még nem tudjuk, hogy melyik melyik PowerShellhez tartozik. Szerencsére a számlálók között ott van a processz azonosítója is:
PS C:\> $proccounters.PathsWithInstances -match "\(powershell\)\\ID Process"
\Process(powershell)\ID Process
\Process(powershell)\ID Process
Akkor kérjük ennek le az értékét külön-külön a #sorszám trükköt alkalmazva:
PS C:\> (Get-Counter -Counter "\Process(powershell)\ID Process").countersamples
.cookedvalue
376
PS C:\> (Get-Counter -Counter "\Process(powershell#1)\ID Process").countersampl
es.cookedvalue
5156
Ellenőrzésképpen lekérdezem az éppen használt PowerShell processz azonosítóját:
PS C:\> $PID
5156
Azaz innentől kezdve engem a #1 végződésű processz-számlálók érdekelnek, abban a PowerShell ablakban futtatok némi logaritmus-számítást egy ciklusban:
PS C:\> for($i = 0; $i -lt 5000000; $i++){[void] [math]::Log(123456)}
Ennek a teljesítményét figyelem a másik PowerShell ablakból:
PS C:\> (Get-Counter -Counter "\Process(powershell#1)\% Processor Time").counte
rsamples.cookedvalue
99,9986100193207
Gyanús kicsit ez a 99.9%, amit úgy kell értelmezni, hogy az aktuális összes processzor terhelésből ez a processz ennyivel veszi ki a részét, de ehhez hozzá kell venni a teljes processzor terhelést. A teljes igazság tehát így jön ki:
PS C:\> $data = (Get-Counter -Counter "\Process(powershell#1)\% Processor Time"
, "\Processor(_total)\% Processor Time").countersamples
PS C:\> $data[0].cookedvalue * $data[1].cookedvalue / 100
12,6964241830632
Itt tehát egyszerre két számlálót nézek és töltök be a $data változóba, majd ezeknek a szorzatát veszem és osztom 100-al, hogy az eredő százalékot kapjam meg. Ez a 12.6% már a reális terhelést adja, amit azt a Task Manager-ben is látjuk:
126 . ábra A Task Manager által mutatott CPU terhelés