답변:
System.Diagnostics 에서 PerformanceCounter 클래스를 사용할 수 있습니다 .
다음과 같이 초기화하십시오.
PerformanceCounter cpuCounter;
PerformanceCounter ramCounter;
cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
ramCounter = new PerformanceCounter("Memory", "Available MBytes");
다음과 같이 소비하십시오.
public string getCurrentCpuUsage(){
return cpuCounter.NextValue()+"%";
}
public string getAvailableRAM(){
return ramCounter.NextValue()+"MB";
}
필요한 것보다 조금 더 많았지 만 여분의 타이머 코드를 사용하여 1 분 이상의 지속 시간 동안 CPU 사용량이 90 % 이상인지 추적하고 경고합니다.
public class Form1
{
int totalHits = 0;
public object getCPUCounter()
{
PerformanceCounter cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";
// will always start at 0
dynamic firstValue = cpuCounter.NextValue();
System.Threading.Thread.Sleep(1000);
// now matches task manager reading
dynamic secondValue = cpuCounter.NextValue();
return secondValue;
}
private void Timer1_Tick(Object sender, EventArgs e)
{
int cpuPercent = (int)getCPUCounter();
if (cpuPercent >= 90)
{
totalHits = totalHits + 1;
if (totalHits == 60)
{
Interaction.MsgBox("ALERT 90% usage for 1 minute");
totalHits = 0;
}
}
else
{
totalHits = 0;
}
Label1.Text = cpuPercent + " % CPU";
//Label2.Text = getRAMCounter() + " RAM Free";
Label3.Text = totalHits + " seconds over 20% usage";
}
}
cpuCounter.NextValue
를 반환합니다float
. 그렇다면 왜 그것을 dynamic
? 그럼 왜 그 반환 dynamic
하여 AS를 object
? 그럼 왜를 할당하려고 object
에 int
라인에 int cpuPercent = getCPUCounter()
? (그 코드는 컴파일되지 않습니다.)
꽤 복잡해 보였던 몇 가지 다른 스레드를 읽는 데 시간을 보낸 후 이것을 생각해 냈습니다. SQL Server를 모니터링하려는 8 코어 시스템에 필요했습니다. 아래 코드의 경우 "sqlservr"을 appName으로 전달했습니다.
private static void RunTest(string appName)
{
bool done = false;
PerformanceCounter total_cpu = new PerformanceCounter("Process", "% Processor Time", "_Total");
PerformanceCounter process_cpu = new PerformanceCounter("Process", "% Processor Time", appName);
while (!done)
{
float t = total_cpu.NextValue();
float p = process_cpu.NextValue();
Console.WriteLine(String.Format("_Total = {0} App = {1} {2}%\n", t, p, p / t * 100));
System.Threading.Thread.Sleep(1000);
}
}
내 8 코어 서버에서 SQL에 사용되는 CPU의 %를 올바르게 측정하는 것 같습니다.
done
에서 true로 설정 합니까? 내가 간과하지 않는 한, 이것은 끝없는 고리 인 것 같습니다 :while(!done){...}
괜찮아, 알았어! 당신의 도움을 주셔서 감사합니다!
이를 수행하는 코드는 다음과 같습니다.
private void button1_Click(object sender, EventArgs e)
{
selectedServer = "JS000943";
listBox1.Items.Add(GetProcessorIdleTime(selectedServer).ToString());
}
private static int GetProcessorIdleTime(string selectedServer)
{
try
{
var searcher = new
ManagementObjectSearcher
(@"\\"+ selectedServer +@"\root\CIMV2",
"SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name=\"_Total\"");
ManagementObjectCollection collection = searcher.Get();
ManagementObject queryObj = collection.Cast<ManagementObject>().First();
return Convert.ToInt32(queryObj["PercentIdleTime"]);
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
return -1;
}
WMI를 사용하여 CPU 백분율 정보를 얻을 수 있습니다. 올바른 권한이 있으면 원격 컴퓨터에 로그인 할 수도 있습니다. http://www.csharphelp.com/archives2/archive334.html 을 보십시오 당신이 무엇을 달성 할 수의 아이디어를 얻을 수 있습니다.
Win32_Process에 대한 MSDN 참조가 도움이 될 수도 있습니다. 네임 스페이스에 .
또한 CodeProject의 예를 참조 C #을 통해 (거의) 모두에서 WMI 방법 :가 .
이것은 프로세서가 특정 비율에 도달 할 때까지 기다리는 예제입니다.
var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
int usage = (int) cpuCounter.NextValue();
while (usage == 0 || usage > 80)
{
Thread.Sleep(250);
usage = (int)cpuCounter.NextValue();
}
이 클래스는 1 초마다 카운터를 자동으로 폴링하며 스레드로부터 안전합니다.
public class ProcessorUsage
{
const float sampleFrequencyMillis = 1000;
protected object syncLock = new object();
protected PerformanceCounter counter;
protected float lastSample;
protected DateTime lastSampleTime;
/// <summary>
///
/// </summary>
public ProcessorUsage()
{
this.counter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public float GetCurrentValue()
{
if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis)
{
lock (syncLock)
{
if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis)
{
lastSample = counter.NextValue();
lastSampleTime = DateTime.UtcNow;
}
}
}
return lastSample;
}
}
System.DateTime
실제로 8 바이트 값 유형은 DateTime
변수 에 대한 할당 이 원자가 아님 을 의미합니다 . 이 코드는 32 비트 플랫폼에서 스레드 안전하지 않습니다.
나는 모든 PerformanceCounter
솔루션에 1 초 스톨을 추가하는 것을 좋아하지 않았습니다 . 대신 WMI
솔루션 을 사용하기로 결정했습니다 . 1 초 대기 / 스톨이 존재하는 이유는PerformanceCounter
입니다. 그러나이 방법을 자주 호출 하고이 정보를 새로 고치면 비동기 프로세스를 수행하려고 생각하더라도 계속 지연이 발생하지 않아야합니다.
여기에서 미리보기 시작 C #을 사용 WMI에서 CPU 사용을 반환 하고 아래에있는 내 블로그 게시물에 솔루션에 대한 자세한 설명을 추가 :
public int GetCpuUsage()
{
var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", Environment.MachineName);
cpuCounter.NextValue();
System.Threading.Thread.Sleep(1000); //This avoid that answer always 0
return (int)cpuCounter.NextValue();
}
이 링크의 원래 정보 https://gavindraper.com/2011/03/01/retrieving-accurate-cpu-usage-in-c/