C #에서 응용 프로그램의 전체 CPU 사용량을 얻고 싶습니다. 프로세스의 속성을 파헤치는 여러 가지 방법을 찾았지만 프로세스의 CPU 사용량과 TaskManager에서 얻는 것과 같은 총 CPU 만 원합니다.
어떻게합니까?
답변
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";
}
}
답변
꽤 복잡해 보였던 몇 가지 다른 스레드를 읽는 데 시간을 보낸 후 이것을 생각해 냈습니다. 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의 %를 올바르게 측정하는 것 같습니다.
답변
괜찮아, 알았어! 당신의 도움을 주셔서 감사합니다!
이를 수행하는 코드는 다음과 같습니다.
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 방법 :가 .
답변
CMS에는 적합하지만 Visual Studio에서 서버 탐색기를 사용하고 성능 카운터 탭을 사용하면 유용한 메트릭을 얻는 방법을 알 수 있습니다.
답변
이것은 프로세서가 특정 비율에 도달 할 때까지 기다리는 예제입니다.
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();
}