c # - Overvågning af en underproces/kan jeg få TotalProcessorTime til en procesgruppe?

Indlæg af Hanne Mølgaard Plasc

Problem



Er der en måde at få Process.TotalProcessorTime , der afspejler en proces PLUS , hvilke processer det har skabt?


Alternativt, hvordan kan jeg kontrollere, at processen (eller dens efterkommere) stadig er 'aktivt' kørende?





Min app spytter en ekstern proces og venter på at den skal gå ud. Med prøvedata tager det 5-20 minutter at fuldføre; Jeg har ikke en chance for en rimelig maksimal timeout. Så min app kontrollerer Process.TotalProcessorTime -værdien på den anden proces med mellemrum for at sikre, at den fortsætter med at stige.


Dette virker fint, men jeg har opdaget, at processen simpelthen er en 'wrapper', der fremkalder en underproces, som igen spytter en håndfuld anden delproces, der forbruger hele CPU-tiden.


Og jeg har fundet ud af, at TotalProcessorTime returnerer kun en lille smule af et sekund efter flere minutter med 100\% CPU-udnyttelse.

Bedste reference


Du kan bruge en performance tæller til at hente hovedprocessen som denne:


PerformanceCounter pc = new PerformanceCounter("Process", 
    "Creating Process Id", " windbg");
Process p = Process.GetProcessById((int)pc.RawValue);


At have den information, du kan overvåge processer i systemet, opretholde en struktur af hele proces træet og beregne TotalProcessorTime for træ. Håber det hjælper

Andre referencer 1


Jeg har ikke implementeret dette, men har fundet ud af hvordan det kan fungere. Det er kedeligt, men ikke alt det kompliceret.



  1. Kryd en baggrundstråd, som hvert par sekunder vil:



    • Byg processtræet (se dette svar for en forenklet version af koden),

    • Afslut (monitorens tråd), hvis processen er ophørt.

    • Vedligeholde en hash af den akkumulerede CPU-anvendelse ved PID,

    • Vedligeholde en sum af alle værdier ved alle processer

    • Vedligehold forskellen mellem summen fra sidste gang tråden blev fyret.


  2. Dette skal gøre det muligt for opkaldskoden at kontrollere, at processen (træet) er
    ikke hængt ( I/O-bundne processer kan have problemer her, men det gælder ikke
    til min sag ).



Intet af dette virker vanskeligt, med den mulige undtagelse for at få CPU-brug af en proces, der ikke er dannet (direkte) af overvågningstråden.


Jeg vil opdatere dette svar, hvis/når jeg implementerer koden, men det kan vare lang tid.