2010-03-09 1 views
7

내 프로그램에서 사용하는 메모리와 CPU의 양을 확인하는 방법을 묻는 질문을 받았으며 성능 카운터를 참조했습니다. 그러나 문서를 보면 응용 프로그램의 매니페스트를 작성하여 소비자 데이터를 제공하는 것에 대해 이야기하고, 내 눈은 유약처럼 보입니다. 그런 범용 툴이 있다는 것은 좋았지 만, 내 프로그램이 얼마나 많은 메모리와 CPU를 사용하고 있는지 알려주는 함수 세트가 필요했습니다.성능 카운터가 내 작업에 적합한 도구입니까? 그렇다면 어떻게 사용합니까?

성능 카운터가 내 작업에 적합한 도구입니까? 그렇다면 어떻게 사용합니까? 정말 C# 응용 프로그램 외부에 어떤 것을 설정하고 싶지 않습니다.

참고 : 나는 응용 프로그램을 프로파일 링 타사 찾는 게 아니에요, 나는 내 응용 프로그램에 의해 표시되는 메모리와 CPU의 데이터가 필요합니다.

UPDATE :이 문제를 혼동 할 듯 나는이 기능에서 시간을 제거했습니다.

+0

"제 3 자 프로파일 링 앱을 찾고 있지 않습니다. 내 앱 안에 데이터가 있어야합니다."- 그건 나에게 맞는 말이 아닙니까? –

+0

당신은 프로파일 러에 대해 이야기하고 있습니다. Visual Studio에 내장 된 버전을 사용하거나 (해당 버전이있는 경우) memprofiler와 같은 것을 사용하십시오. –

+0

@Mitch : 이제 질문이 더 명확합니까? – Simon

답변

1

성능 카운터는 응용 프로그램에서 응용 프로그램에 소요 된 시간을 알려주지 않습니다. 이를 위해 함수의 시작 부분에서 시작하여 끝에서 멈추는 일종의 타이머 클래스를 사용할 수 있습니다.

+0

DateTime을 추가하는 것만 큼 쉽지는 않습니다. start = DateTime.Now; 및 DateTime end = DateTime.Now; 함수의 시작과 끝에서? 또는 실행 전후에. 그럼 그냥 TimeSpan timespent = end - start; 그리고 값으로 어떤 로깅이나 무언가를하십시오. – Alxandr

+0

@shoosh : 좋아, 나머지는 어때? – Simon

+0

@Alxandr : 밀리 초의 정확도로는 충분하지 않으며 Stopwatch로 더 좋은 해상도를 얻는 데 너무 오래 걸리므로 값이 왜곡됩니다. – Simon

3

당신은 CPU, 메모리 및 디스크 사용량뿐만 아니라 많은 .NET 특정 성능 카운터를 모니터링 상자 밖으로 perfmon를 사용할 수 있습니다. perfmon에는 창문이 있습니다. 당신이 당신의 자신의 성능 모니터를 작성하려는 경우

눈 - 글레이저

에만 필요, 또는 당신은 당신의 자신의 성능 카운터를 제공합니다. 후자는 사용자가이 값을 모니터링해야하는 경우에만 흥미로울 것입니다 (예 : 서버 응용 프로그램을 개발 중이며 사용자가 무효화 된 달의 위상으로 인해 거부 된 연결의 수가 10 % 이하인지 확인해야하는 경우).

특정 기능에 소요되는 시간을 확인하려면 프로파일 러를 사용하십시오.


성능 카운터 API는 당신이 (당신이 다른 프로세스가 디스크를 탈곡하기 때문에 기능 Foo 11 후 매우 느린 매일 밤을 얻는다 그 예 말할 수있는) 기존의 성능 카운터와 데이터를 함께 모니터링 할 수 있도록, 그리고 것 모니터를 서비스로 실행하고 나중에 분석 할 수 있도록 로그 파일을 생성 할 수 있습니다. 당신은 이러한 혜택 있는지 여부를 파악해야한다

성능 카운터의 추가 문제 가치가있다, 또는 당신이 로깅 시스템에 더 나을 경우.

당신을 위해 쉽게 만들 수도 꽤 샘플 out there있다. 그러나 아키텍처와 "공식"용어를 이해하는 데 여전히 많은 돈이 소요됩니다. 일반적으로 MS API의 과 같이 많은 양의 판독 코드가 필요하며 좋은 래퍼 코드를 찾고 있습니다. 그렇다고해서 항상 고통 스럽다는 의미는 아닙니다.

+0

나는 효과적으로 내 perfmon을 쓰고 싶지만 내 응용 프로그램에만 쓰고 싶다. 자체 CPU 및 메모리 사용을 표시해야합니다. – Simon

+0

@ 시몬 : 답변을 업데이트했습니다. – peterchen

+0

감사합니다. SystemMonitor 프로젝트는 특히 좋은 리드처럼 보입니다. – Simon

0

는이를 위해 기능

에 지출 얼마나 많은 시간을 당신은 (하나의 비주얼 스튜디오의 고급 버전에 포함 등) 프로파일 러가 필요합니다. 이렇게하면 각 메소드가 호출 된 횟수 (호출하는 함수의 유무에 관계없이)를 알 수 있습니다.

병목 현상을 식별하기위한 필수 세부 사항.

CPU는

(작업 관리자 또는 프로세스 탐색기 또는 열) 총 공정 CPU-초 성능 카운터 당신이를 줄 것이다. 실제로는 사용할 수있는 세부 정보 (커널 대 사용자 시간)가 필요할 수도 있습니다.

메모리는

이 어려운 부분이다 .... "메모리"의미 할 수있다 : 할당 된 가상 주소 공간 최선을 다하고 가상 주소 공간, 작업 집합, 최대 작업 집합, 개인 메모리를 ..

실제 내부 분석을 시작하기 전에 이들이 다른 점과 의미가 무엇인지 이해하려면 Windows 내부 또는 이와 유사한 참조로 약간의 시간을 할애해야 할 것입니다. 당신이 뭔가를 할 수있는 CPU 사용량 및 메모리 (프로세스 작업 집합)에 대한 단일 인스턴스 응용 프로그램을 가정

+0

"전체 프로세스 CPU 초 성능 카운터"를 찾는 방법은 무엇입니까? – Simon

+0

@ 시몬 : perfmon에서 과정 중. – Richard

+0

@ 리차드 : 제 앱에서 어떻게 사용합니까? – Simon

3

다음 CPU 사용 퍼포 레이션에 대한

public static void Main(string[] args) 
{ 
    string processName = Process.GetCurrentProcess().ProcessName; 
    int processorCount = Environment.ProcessorCount; 

    // Simulate process usage 
    for (int i = 0; i < processorCount * 2; i++) 
    { 
     var t = new Thread(() => 
      { 
       while (true) { Console.WriteLine("Busy..."); } 
      }); 

     t.IsBackground = true; 
     t.Start(); 
    } 

    var cpu = new PerformanceCounter("Process", "% Processor Time"); 
    cpu.InstanceName = processName; 
    cpu.NextValue(); 

    var ram = new PerformanceCounter("Process", "Working Set"); 
    ram.InstanceName = processName; 

    float memUsage = (ram.NextValue()/1024)/1024; 
    Console.WriteLine("Memory Usage: {0}MB", memUsage); 

    float cpuUsage = cpu.NextValue()/(float)processorCount; 
    Console.WriteLine("CPU Usage: {0}%", cpuUsage); 
} 

NextValue 반환에 첫 번째 통화를 카운터 0 그래서 단지 두 번째 호출은 값을 표시하는 데 사용됩니다. 보고 된 사용량은 모든 기계 프로세서의 합계이므로 평균이 표시되기 전에 계산됩니다.

간단한 내용
2

, 당신의 C# 코드 내에서이 값에서 봐, 당신과 가장 관련이 무엇을 선택 :

 
System.Diagnostics.Process.GetCurrentProcess().TotalProcessorTime 
System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64 
System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64 
System.GC.GetTotalMemory(false) 

PrivateMemorySize은 총 전용 바이트입니다 (관리와 결합되지 않는) 프로세스에 대한 . GetTotalMemory는 앱의 전체 관리 메모리 사용량을 제공하며 true를 전달하면 값을 얻기 전에 GC가 강제 실행됩니다.

+0

좋은데 - CPU는 어떻습니까? – Simon

+0

현재, 즉각적인 CPU 사용량에 대한 것이 있는지 모르겠지만 TotalProcessorTime은 프로세스에서 사용한 총 시간을 알려줍니다. CPU 사용량에 대한 즉각적인보고가 있다면 성능 카운터 또는 WMI를 살펴 봐야합니다. –