[C#] C #에서 CPU 사용량을 얻는 방법?

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();
}