문제

오랫동안 실행될 배경 프로그램을 작업 중이며 외부 로깅 프로그램이 있습니다 (SmartInspect) 디버깅 할 때 실시간으로 모니터링하기 위해 주기적으로 일부 값을 공급하고 싶습니다.

작업 관리자 또는 IARSN TaskInfo와 같은 여러 프로그램을 간단히 발사 할 수 있다는 것을 알고 있지만 프로그램이 더 많이 사용하는 경우와 같은 간단한 규칙을 추가하고 싶기 때문에 내 프로그램에 모든 것을 유지하고 싶습니다. X% CPU, 로그에 이것을 플래그하십시오.

메모리 소비, 작업 세트 등과 같은 SmartInspect에 일부 통계를 주기적으로 공급하는 백그라운드 스레드가 있습니다.

이 스레드가 컴퓨터의 CPU 자원이 얼마나 많이 소비되는지에 대한 합리적으로 정확한 척도를 얻을 수 있습니까? 기본 프로그램은 단일 스레드 애플리케이션 (통계를 기록하는 Watchdog 스레드 제외)이므로 기술이 제한되는 경우 단일 스레드는 얼마를 사용합니까? 그러면 그것도 좋을 것입니다.

나는 무언가와 관련된 일부 항목을 발견했습니다 루지 Linux와 C의 경우 이것에 사용할 수있는 비슷한 것이 있습니까?


편집하다: 좋아, 나는 성능 카운터 웨이를 시도했지만 매번 많은 GC 데이터를 추가하여 메모리 사용 및 쓰레기 수집을위한 그래프가 급등했습니다. 지금은이 부분을 남겨 둘 것 같아요.

도움이 되었습니까?

해결책

당신은 또한 사용할 수 있습니다 System.diagnostics.Process.totalProcessortime 그리고 System.diagnostics.ProcessThread.totalProcessortime 프로세서 사용량을 계산하는 속성 기사 설명합니다.

다른 팁

살펴보십시오 System.Diagnostics.PerformanceCounter. 당신이 달리면 perfmon.exe, 당신은 당신이 사용할 수있는 다양한 성능 카운터 ( '성능 객체'를 '프로세스'로 설정)를 볼 수 있으며 그 중 하나는 '% 프로세서 시간'입니다.

System.diagnostic.performancecounter 클래스를 통해 할 수 있습니다. CPU 사용량을 모니터링하는 사람의 예는 다음과 같습니다.

http://blogs.msdn.com/dotnetinterop/archive/2007/02/02/system-diagnostics-performancecounter-and-processor-on-multi-core-or-multi-cpu.aspx

이를 위해서는 높은 특권이 필요합니다. 그리고 그것을 사용하는 성능이있을 수 있습니다.

SmartInspect와 같은 모니터에 로그인하는 것이 좋습니다. 그러나 Windows 자체는이 경우 프로그램 (또는 프로세스)에서 각 리소스에 대한 데이터를 수집합니다. WMI는 응용 프로그램 모니터링의 표준입니다. WMI가 캡처 한 데이터를 볼 수 있습니다. 많은 애플리케이션 관리, 건강 모니터링 또는 응용 프로그램 모니터링 도구는 WMI를 상자에서 지원합니다.

따라서 응용 프로그램 내에서 CPU 사용량을 로그 파일에 로그인하는 것이 좋습니다.

가용성과 성능이 중요하다고 생각되면 Microsoft Operations Manager 솔루션과 같은 솔루션을 찾으십시오.

WMI에 대한 아이디어를 얻고 프로세스 목록을 얻으려면 아래를 참조하십시오. Win32_PerfFormattedData_PerfProc_Process CPU 시간을 얻으려면 필터가 processID입니다이 기사를 참조하십시오-Win32_Process 클래스에서 ProcessID를 얻을 수 있습니다.

WMI는 C#을 쉽게 만들었습니다. Kevin Matthew Goss

oConn.Username = "JohnDoe";
oConn.Password = "JohnsPass";

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);    

//get Fixed disk stats
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery);

//Get the results
ManagementObjectCollection oReturnCollection = oSearcher.Get();   

//loop through found drives and write out info
foreach( ManagementObject oReturn in oReturnCollection )
{
    // Disk name
    Console.WriteLine("Name : " + oReturn["Name"].ToString());
    // Free Space in bytes
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString());
    // Size in bytes
    Console.WriteLine("Size: " + oReturn["Size"].ToString());
} 

원격 시스템에서도 프로세스를 모니터링 할 수 있습니다.

이 코드 프로젝트 기사는 고성능 타이머를 사용하는 방법에 대해 설명합니다.

http://www.codeproject.com/kb/cs/highperformancetimercshar.aspx

코드의 실행 시간에이를 사용할 수 있습니다.

여기에서 여러 오픈 소스 C# 프로파일 러를 찾을 수 있습니다.

http://csharp-source.net/open-source/profile

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top