Muss ich anrufen genaue CPU-Auslastung eines einzelnen Prozesses
Der Trick ist, ich muss auch in der Lage sein, es zu tun auf multi-core-Maschinen. Meine Ausbildung in C# ist ein bisschen gebrochen. Ich habe es geschafft den folgenden code. Kann jemand mir helfen? Iv versucht, mit dem "_Total" - flag, und ich habe versucht, ändern einige andere code-snippets, die sah, wie Sie versuchte zu erkennen die Menge der Kerne. Mir wurde gesagt, aber Sie nicht zählen HT und unterstützte nur physische, nicht logische Prozessoren. Ich war versucht, es zu erhalten, beides zu tun. Wohl Ihr, ist eine Möglichkeit, manuell tun dies mit
("Process", "% Processor Time", "1" process.ProcessName))
("Process", "% Processor Time", "2" process.ProcessName))
("Process", "% Processor Time", "3" process.ProcessName))
etc. Aber ich habe herausgefunden, das hardware, die nicht funktioniert, wenn die Kerne dont bestehen. Ich hatte gehofft, ich könnte über etwas mehr kommen flexibel. Iv auf dieses Ziel hingearbeitet, Tagen, Stunden und Stunden zu einer Zeit, und ich werde mir das Haar ausreißen.
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Collections;
using System.IO;
namespace Program_CPU_Monitor
{
class Program
{
static void Main(string[] args)
{
StreamWriter log;
log = File.AppendText("c:\\CPUMON.txt");
log.WriteLine("");
log.WriteLine("**Started logging Program CPU Monitor (2.6.0.63)**");
log.Close();
Console.Title = "Program CPU Monitor 2.6.0.63";
Console.WriteLine("Monitoring Program CPU & Memory usage...(1-min intervals)");
Console.WriteLine("Monitoring will start when Program is detected as running.");
Console.WriteLine("Please type in program name without the '.EXE', For example 'TESV' or 'calc'.");
Console.WriteLine("The program name is case sensative. Without the proper case it will not work.");
Console.WriteLine("This program will leave a log of the display called 'CPUMON.txt' on drive C:/.");
Console.WriteLine("Please type program name...");
Console.WriteLine("");
string procName = Console.ReadLine();
while (true)
{
Process[] runningNow = Process.GetProcesses();
foreach (Process process in runningNow)
{
using (PerformanceCounter pcProcess = new PerformanceCounter("Process", "% Processor Time", process.ProcessName))
using (PerformanceCounter memProcess = new PerformanceCounter("Memory", "Available MBytes"))
{
if (process.ProcessName == procName)
{
pcProcess.NextValue();
Thread.Sleep(60000);
StreamWriter OurStream;
OurStream = File.AppendText("c:\\CPUMON.txt");
Console.WriteLine("");
OurStream.WriteLine("");
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Process: '{0}' CPU Usage: {1}%", process.ProcessName, pcProcess.NextValue());
OurStream.WriteLine("Process: '{0}' CPU Usage: {1}%", process.ProcessName, pcProcess.NextValue());
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Process: '{0}' RAM Free: {1}MB", process.ProcessName, memProcess.NextValue());
OurStream.WriteLine("Process: '{0}' RAM Free: {1}MB", process.ProcessName, memProcess.NextValue());
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine(string.Format("Recorded: '{0}' at {1}", procName, DateTime.Now.ToString()));
OurStream.WriteLine(string.Format("Recorded: '{0}' at {1}", procName, DateTime.Now.ToString()));
OurStream.Close();
}
}
}
}
}
}
}
EDIT:: ich habe folgende änderungen vorgenommen, um den code zu beheben meine Probleme pro Rat und general fiddeling herum.
foreach (Process process in runningNow)
{
using (PerformanceCounter cpuUsage = new PerformanceCounter("Process", "% Processor Time", "_Total"))
using (PerformanceCounter pcProcess = new PerformanceCounter("Process", "% Processor Time", process.ProcessName))
using (PerformanceCounter memProcess = new PerformanceCounter("Memory", "Available MBytes"))
{
if (process.ProcessName == procName)
{
StreamWriter OurStream;
OurStream = File.AppendText("c:\\CPUMON.txt");
Console.WriteLine("");
OurStream.WriteLine("");
//Prime the Performance Counters
pcProcess.NextValue();
cpuUsage.NextValue();
Thread.Sleep(100);
isprimed = true;
double cpuUse = Math.Round(pcProcess.NextValue() / cpuUsage.NextValue() * 100, 2);
//Check for Not-A-Number (Division by Zero)
if (Double.IsNaN(cpuUse))
cpuUse = 0;
//Get CPU Usage
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Process: `{0}' CPU Usage: {1}%", process.ProcessName, Convert.ToInt32(cpuUse));
OurStream.WriteLine("Process: `{0}' CPU Usage: {1}%", process.ProcessName, Convert.ToInt32(cpuUse));
//Get Process Memory Usage
Console.ForegroundColor = ConsoleColor.Green;
double memUseage = process.PrivateMemorySize64 / 1048576;
Console.WriteLine("Process: `{0}' Memory Usage: {1}MB", process.ProcessName, memUseage);
OurStream.WriteLine("Process: `{0}' Memory Usage: {1}MB", process.ProcessName, memUseage);
//Get Total RAM free
Console.ForegroundColor = ConsoleColor.Cyan;
float mem = memProcess.NextValue();
Console.WriteLine("During: `{0}' RAM Free: {1}MB", process.ProcessName, mem);
OurStream.WriteLine("During: `{0}' RAM Free: {1}MB", process.ProcessName, mem);
//Record and close stream
Console.ForegroundColor = ConsoleColor.Yellow;
System.DateTime newDate = System.DateTime.Now;
Console.WriteLine("Recorded: {0}", newDate);
OurStream.WriteLine("Recorded: {0}", newDate);
OurStream.Close();
Thread.Sleep(59900);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nur Lesen Sie die performance-Zähler, der alle 100 ms oder die timesilce zu klein für Sie zu bekommen eine genaue Lektüre, wenn man mehr als einmal liest alle 100ms wird es immer melden 0 oder 100% Auslastung. Denn Sie rufen
NextValue()
zweimal (einmal für die Datei, einmal für den stream) die zweite Lesung wird der Verbrauch seit dem letzten Lesen von der Zeile vor.Ändern Sie Ihren code zu diesem:
Möglicherweise gibt es andere Probleme, die Probleme verursacht, aber zugleich NextValue zweimal ist die erste, die mir entgegen sprangen.
Erklärung:
Den Grund hinter
NextValue
nur reporting 0 oder 100%, wenn Sie AnfrageNextValue
zu schnell, ist die Tatsache, dass wenn Sie derzeit ausführen von code oder nicht ist ein boolescher Faktor.So, wie die performance-Zähler macht, ist die Frage:
Die Größe der Zeitscheiben an die performance-counter arbeitet, ist 100ms also, wenn Sie gehen, unter 100 MS Sie sind im Grunde die Fragen,
und die einzigen beiden Antworten, die Sie bekommen können zu dieser Frage "Keine" (0%) oder "ja" (100%).
Sleep(100)
(110 vielleicht?) um sicherzustellen, dass Sie Kreuz, 100ms Anforderung. Auch wenn man sich in zu wie zu tun Parallel.ForEach, und stellen Sie das schreibt die Datei in den localFinally (müssen Sie fügen Sie ein wenig Sperre für die Datei schreiben, als mehrere threads versuchen zu schreiben, um die Datei auf einmal) brauchen Sie nicht zu warten, für jeden Prozess werden aufgezählt in der Reihenfolge, Sie können Holen Sie sich eine Momentaufnahme der alle von Ihnen zur gleichen Zeit.