Több példánnyal redelkező számlálók kezelése

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:

119 . á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:

120 . ábra A Task Manager által mutatott CPU terhelés



Word To HTML Converter