windows - bestemme 'systembelastning'

Indlæg af Hanne Mølgaard Plasc

Problem



Er der nogen der kender en elegant måde at bestemme 'System Load', helst ved at bruge Windows Performance-tællere? I dette tilfælde betyder jeg 'System Load' i den klassiske (UNIX) betydning af udtrykket og ikke i den almindeligt forvirrede 'CPU Utilization' procent.


Baseret på min læsning ... 'System Load' er typisk repræsenteret som en float, der definerer antallet af processer i en løbelig tilstand (dvs. ikke inklusive antallet af processer, der for øjeblikket er blokeret af en eller anden grund), der kan køres på en given tid. Wikipedia giver en god forklaring her - http://en.wikipedia.org/wiki/Load\_(computing).[8][9]


Forresten arbejder jeg i C #, så nogle eksempler på det sprog ville blive meget værdsat.

Bedste reference


Systembelastning, i UNIX-sans (og hvis jeg husker korrekt), er antallet af processer, der kan køres, der ikke rent faktisk kører på en CPU (i gennemsnit over en tidsperiode). Utilities like top Vis denne belastning over for eksempel de sidste 1, 5 og 15 minutter.


Jeg tror ikke det er muligt med standard Win32 WMI proces -klasser. Processtatusfeltet (ExecutionState) i WMI Win32\_Process objekterne dokumenteres som ikke brugt.


Trækklassen gør imidlertid, at oplysningerne (og det er nok en bedre indikator som moderne operativsystemer har tendens til at planlægge tråde frem for processer). Win32\_Thread klassen har en ExecutionState felt, der er indstillet til en af:



  • 0 Ukendt

  • 1 Andet

  • 2 Klar

  • 3 kører

  • 4 Blokeret

  • 5 Suspended Blocked

  • 6 Suspended Ready



Hvis du skulle lave en forespørgsel af denne klasse og tælle antallet af type 2 (og muligvis type 6; jeg tror suspenderede midler byttes ud i denne sammenhæng), der burde give dig dit øjebliksbillede. Du ville så nødt til at gennemsnitlige dem selv, hvis du ønskede gennemsnit.


Alternativt er der også en ThreadState i denne klasse:



  • 0 Initialiseret (anerkendt af mikrokernen).

  • 1 Klar (klar til at køre på næste tilgængelige processor).

  • 2 Kører (eksekvering).

  • 3 Standby (ved at køre, kun en tråd kan være i denne tilstand ad gangen).

  • 4 Afsluttet (færdig udførelse).

  • 5 Venter (ikke klar til processoren, når den er klar, vil den blive omlagt).

  • 6 Overgang (venter på andre ressourcer end processoren).

  • 7 Ukendt (tilstand er ukendt).
    så du kan se på at tælle dem i tilstand 1 eller 3.



Spørg mig ikke hvorfor er der to felter med lignende oplysninger, eller hvad forskellen er. Jeg har længe siden stoppet anden gætter Microsoft med deres WMI-info, jeg skal bare overbevise de beføjelser, der er, at mit valg er en levedygtig en :-)


Når jeg lige er færdig med at udvikle en Windows-klient til vores egen overvågningsprogram, foreslår jeg bare at gå til 1 sekunders snapshots og gennemsnitlige disse over hvilken tidsramme du skal rapportere om. VBScript og WMI virker bemærkelsesværdigt modstandsdygtige selv ved en forespørgsel pr. Sekund - det ser ud til at sutte for meget CPU, og så længe du frigiver alt, du bruger, kan du køre i længere tid.


Så, hvert sekund, gør du noget (i VBScript og fra hukommelsen, da jeg ikke har klar adgang til koden hidtil):


set objWmi = GetObject("winmgmts:\.
ootcimv2")
set threadList = objWmi.ExecQuery("select * from Win32\_Thread",,48)
sysLoad = 0
for each objThread in threadList
    if objThread.ThreadState = 1 or objThread.ThreadState = 3 then
        sysLoad = sysLoad + 1
    end if
next
' sysLoad now contains number of threads waiting for a CPU. '