본문 바로가기
프로그래밍

cpu 사용률 구하는 방법에 대한 다양한 견해

by 건우아빠유리남편 2009. 12. 24.
반응형
윈도우에서 CPU 사용률 구하는 방법은 
1. Performance Data Registry Interface를 사용하는 방법
http://www.codeproject.com/system/cpuusage.asp
2. 1번을 보다 쉽게 도와주는 Performance Data Helper(pdh.dll) Interface를 이용하는 방법
http://www.codeproject.com/system/cpdh.asp
3. GetSystemTimes 를 이용하는 방법
http://www.codeproject.com/threads/Get_CPU_Usage.asp
등이 있다.

cpu 사용률 구하는 공식은 다음과 같다

cpu usage = (system time - idle time) / system time
system time = user time + kernel time

user, kernel, idle time 모두 GetSystemTimes 으로 구할 수 있으며
윈도우 Task Manager에서 보여주는 CPU 사용률과 가장
근접하게 구하는 방법은
100 msec간격으로 5번을 위 공식을 사용하여 cpu usage 를 구하고
이를 평균을 낸 값을 취한다.

WinCE에서는 3.0버젼부터 GetIdleTime 함수가 
지원되며 GetTickCount (system time) 와 GetIdleTime으로 CPU 사용률을 구할 수 있다.
다만 WinCE를 포팅하는 제조사에서 GetIdleTime함수를 제대로 지원하는 Target에서만 가능하다.
MSDN보면 Coredll.lib 가 이 함수를 제공하고 헤더는 Winbase.h에 서 제공한다고 되어 있지만 구라다. Pkfuncs.h로 옮겨졌으며 이건 plaform builder가 있어야 볼수 있는 헤더파일이다. 
그냥 소스헤더에 DWORD GetIdleTime(); 라고 써주자.



CPU사용률은 /proc/stat를 참고하면 된다. [root@coco /root]# cat /proc/stat

cpu번호      user모드      nice user모드            system모드           idle 상태

----------------------------------------------------------------------------------------------

cpu           1714278               9666                      631901             135528477
cpu0           842765               5302                      372331               67721763
cpu1           871513               4364                      259570               67806714



CPU사용률로써 부팅후 지금까지 소모된 jiffies의 크기를 나타낸다. 5개의 필드로 구성되어 있으며, 첫번째 필드는 CPU번호, 두번째 필드는 user 모드, 세번째 필드는 low priority(nice상태)의 user모드를 나타낸다. 네번째 필드는 system 모드 마지막은 idle 테스크의 jiffies 소모 값을 나타낸다. 우리가 필요로 하는 값은 두번째, 네번째, 다섯번째 필드의 값으로 이들 값을 이용해서 CPU의 사용율을 얻어올 수 있다.
cpu라고 적힌 부분의 값은 전체 cpu의 상태값을 나타내며, cpu0는 첫번째 cpu 상태값, cpu1는 두번째 cpu 상태값을 나타냅니다. 현재 제가 보여드린 시스템은 펜3 cpu 2개짜리 서버입니다.

만약 CPU의 IDLE상태만을 알고 싶다면 다섯번째 필드값만을 조사하면 될것이다.

이렇게 해서 CPU의 jiffies를 가지고 오긴 했지만 이것만으로는 우리가 원하는 정보를 얻어올순 없다. 실제 우리가 원하는 정보는 전체 CPU사용 jiffies중 idle jiffies를 얻어와야 하고 이것을 다시 백분율로 표시해야 하므로 약간의 가공을 해주어야 한다.

방법은 간단하다. 일정시간 소비된 idel jiffies를 총 소비된 jiffies로 나눠 주면 된다. (idle jiffies)*100 / (idle jiffies + use jiffies + system jiffies + low prio jiffies)
위의 방법을 통하면 cpu의 idle의 백분율 값을 얻어올 수 있다. 일정 시간은 초단위로 하면 되고, 소비된 jiffies를 구해야 함으로 이전의 jiffies값을 가지고 있어야 된다.


cpu 전체값 = (user모드+nice user 모드+system 모드+idle 상태)
user 모드 사용율 = (user 모드)*100 / cpu 전체값 
user 모드 사용율 = (user모드 / cpu 전체값) * 100
system 모드 사용율 = (system 모드 / cpu 전체값) * 100

반응형

댓글