Frage

Ich habe ein Samurisieren config, die ein CPU-Auslastungsdiagramm ähnlich dem Task-Manager anzeigt.

Wie kann ich auch den Namen des Prozesses mit der aktuell höchsten CPU-Auslastung in Prozent anzeigen?

Ich möchte, dass dies höchstens einmal pro Sekunde aktualisiert wird.Samurize kann ein Befehlszeilentool aufrufen und dessen Ausgabe auf dem Bildschirm anzeigen, daher könnte dies auch eine Option sein.


Weitere Klarstellung:

Ich habe versucht, meine eigene C#-.NET-Befehlszeilenanwendung zu schreiben, um das von System.Diagnostics.Process.GetProcesses() zurückgegebene Array aufzuzählen, aber die Process-Instanzklasse scheint keine CPU-Prozentsatzeigenschaft zu enthalten.

Kann ich das irgendwie berechnen?

War es hilfreich?

Lösung

Mit PowerShell:

Get-Process | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName -hidetableheader

gibt etwa Folgendes zurück:

  16.8641632 System
   12.548072 csrss
  11.9892168 powershell

Andere Tipps

Was Sie erhalten möchten, ist die sofortige CPU-Auslastung (sozusagen) ...

Tatsächlich gibt es keine sofortige CPU-Auslastung für einen Prozess.Stattdessen müssen Sie zwei Messungen durchführen und die durchschnittliche CPU-Auslastung berechnen. Die Formel ist ganz einfach:

AvgCpuUsed = [TotalCPUTime(process,time2) – TotalCPUTime(process,time1)] / [time2-time1]

Je geringer der Unterschied zwischen Zeit2 und Zeit1 ist, desto „augenblicklicher“ erfolgt Ihre Messung.Der Windows Task-Manager berechnet die CPU-Auslastung im Abstand von einer Sekunde.Ich habe festgestellt, dass das mehr als genug ist, und Sie könnten sogar darüber nachdenken, es in 5-Sekunden-Intervallen durchzuführen, da die Messung selbst CPU-Zyklen in Anspruch nimmt ...

Also zunächst, um die durchschnittliche CPU-Zeit zu ermitteln

    using System.Diagnostics;

float GetAverageCPULoad(int procID, DateTme from, DateTime, to)
{
  // For the current process
  //Process proc = Process.GetCurrentProcess();
  // Or for any other process given its id
  Process proc = Process.GetProcessById(procID);
  System.TimeSpan lifeInterval = (to - from);
  // Get the CPU use
  float CPULoad = (proc.TotalProcessorTime.TotalMilliseconds / lifeInterval.TotalMilliseconds) * 100;
  // You need to take the number of present cores into account
  return CPULoad / System.Environment.ProcessorCount;
}

Für die „sofortige“ CPU-Last benötigen Sie nun eine spezielle Klasse:

 class ProcLoad
{
  // Last time you checked for a process
  public Dictionary<int, DateTime> lastCheckedDict = new Dictionary<int, DateTime>();

  public float GetCPULoad(int procID)
  {
    if (lastCheckedDict.ContainsKey(procID))
    {
      DateTime last = lastCheckedDict[procID];
      lastCheckedDict[procID] = DateTime.Now;
      return GetAverageCPULoad(procID, last, lastCheckedDict[procID]);
    }
    else
    {
      lastCheckedDict.Add(procID, DateTime.Now);
      return 0;
    }
  }
}

Sie sollten diese Klasse über einen Timer (oder eine beliebige Intervallmethode) aufrufen jeden Prozess, den Sie überwachen möchten, wenn Sie alle Prozesse möchten, verwenden Sie einfach die Process.GetProcesses statische Methode

Aufbauend auf Frederics Antwort und Verwendung des Codes am Ende der Seite Hier (Ein Anwendungsbeispiel finden Sie unter Das Beitrag), um dem gesamten Satz an Prozessen beizutreten, die daraus stammen Get-Process, erhalten wir Folgendes:

$sampleInterval = 3

$process1 = Get-Process |select Name,Id, @{Name="Sample1CPU"; Expression = {$_.CPU}}

Start-Sleep -Seconds $sampleInterval

$process2 = Get-Process | select Id, @{Name="Sample2CPU"; Expression = {$_.CPU}}

$samples = Join-Object -Left $process1 -Right $process2 -LeftProperties Name,Sample1CPU -RightProperties Sample2CPU -Where {$args[0].Id -eq $args[1].Id}

$samples | select Name,@{Name="CPU Usage";Expression = {($_.Sample2CPU-$_.Sample1CPU)/$sampleInterval * 100}} | sort -Property "CPU Usage" -Descending | select -First 10 | ft -AutoSize

Das gibt eine Beispielausgabe von

Name                  CPU Usage
----                  ---------
firefox        20.8333333333333
powershell_ise 5.72916666666667
Battle.net               1.5625
Skype                    1.5625
chrome                   1.5625
chrome         1.04166666666667
chrome         1.04166666666667
chrome         1.04166666666667
chrome         1.04166666666667
LCore          1.04166666666667

Möglicherweise können Sie es verwenden Pmon.exe dafür.Sie können es als Teil des erhalten Windows Resource Kit-Tools (Der Link führt zur Server 2003-Version, die offenbar auch unter XP verwendet werden kann).

Irgendwie

Get-Process | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName,TotalProcessorTime -hidetableheader

Ich habe die CPU-Informationen nicht vom Remote-Computer erhalten.Ich musste mir das einfallen lassen.

Get-Counter '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples | Select-Object -Property instancename, cookedvalue| Sort-Object -Property cookedvalue -Descending| Select-Object -First 10| ft -AutoSize

Danke für die Formel, Jorge.Ich verstehe nicht ganz, warum man durch die Anzahl der Kerne dividieren muss, aber die Zahlen, die ich bekomme, stimmen mit dem Task-Manager überein.Hier ist mein Powershell-Code:

$procID = 4321

$time1 = Get-Date
$cpuTime1 = Get-Process -Id $procID | Select -Property CPU

Start-Sleep -s 2

$time2 = Get-Date
$cpuTime2 = Get-Process -Id $procID | Select -Property CPU

$avgCPUUtil = ($cpuTime2.CPU - $cpuTime1.CPU)/($time2-$time1).TotalSeconds *100 / [System.Environment]::ProcessorCount

Sie können es auch so machen:-

public Process getProcessWithMaxCPUUsage()
    {
        const int delay = 500;
        Process[] processes = Process.GetProcesses();

        var counters = new List<PerformanceCounter>();

        foreach (Process process in processes)
        {
            var counter = new PerformanceCounter("Process", "% Processor Time", process.ProcessName);
            counter.NextValue();
            counters.Add(counter);
        }
        System.Threading.Thread.Sleep(delay);
        //You must wait(ms) to ensure that the current
        //application process does not have MAX CPU
        int mxproc = -1;
        double mxcpu = double.MinValue, tmpcpu;
        for (int ik = 0; ik < counters.Count; ik++)
        {
            tmpcpu = Math.Round(counters[ik].NextValue(), 1);
            if (tmpcpu > mxcpu)
            {
                mxcpu = tmpcpu;
                mxproc = ik;
            }

        }
        return processes[mxproc];
    }

Verwendung:-

static void Main()
    {
        Process mxp=getProcessWithMaxCPUUsage();
        Console.WriteLine(mxp.ProcessName);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top