윈도우 관리도구의 성능(perfmon.exe)에 직접 항목을 추가하여 사용할 수 있다고 해서 찾아봤습니다.

Performance DLL 방법을 해봤는데 잘 안되네요. 뭘 잘못했지..
나중에 vista 이상으로 올려서 version 2.0 방법으로 다시 해봐야겠습니다.
(그런데 이거 잘 안쓰나요? 인터넷에 사용하는 사람이 안보이네요.)
 

Performance Counter
 
Performance Counter 사용 방법
 
데이터 제공 방법
1. version 2.0 사용(windows vista 이상)
2. DLL 작성
 
데이터 사용 방법
1. PDH(Performance Data Helper) 사용
2. 포퍼먼스 레지스트리 조회(HKEY_PERFORMANCE_DATA)
 
준비사항
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib"
레지스트리 백업 (만약을 위해..)
 
 
 
Performance DLL 사용하여 데이터 제공하는 방법
 
1. 성능 모니터 카운터 추가
방법1. .h., ini 작성후 lodctr.exe 로 등록 (MSDN 예제)
http://msdn.microsoft.com/en-us/library/aa371878(v=VS.85).aspx
 
방법2. 레지스트리 직접 조작(regedit 직접 수정 혹은 프로그래밍으로 등록)
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\
CurrentVersion\\Perflib\\012" 에서
 
"Counter", "Help" 에 사용할 카운터 및 설명 추가
"Counter" : "짝수(n)   카운터명" 형식 (REG_MULTI_SZ)
"Help" : "홀수(n+1) 설명"     형식 (REG_MULTI_SZ)
 
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\
CurrentVersion\\Perflib"  에서
 
"Last Counter" : 추가한 마지막 값으로 변경(REG_DWORD)
"Last Help" : 추가한 마지막 값으로 변경(REG_DWORD)
 
2. 서비스 레지스트리 등록
"HKEY_LOCAL_MACHINE\\SYSTEM\CurrentControlSet\\Service\\서비스이름\\Performance"에
"Library" : DLL 경로 및 파일 이름. (REG_SZ)
"Open" : DLL안의 OpenPerformanceData    를 구현한 함수명 등록. (REG_SZ)
"Close" : DLL안의 CollectPerformanceData 를 구현한 함수명 등록. (REG_SZ)
"Collect" : DLL안의 ClosePerformanceData   를 구현한 함수명 등록. (REG_SZ)
"Object List" : 추가한 [카운터, 설명] 번호를 공백 구분자로 입력(REG_SZ)
"First Counter", "Fist Help", "Last Counter", "Last Help"를 등록하고 카운터마다 해당되는 Object(Counter)를
"Object List"에 등록하는게 정석.
 
3. Performance DLL 작성
시스템에서 호출하는 OpenPerformanceData, CollectPerformanceData, ClosePerformanceData 함수 구현
각 함수들은 여러 스레드나 프로레스에서 사용될 수 있으므로 criticalsection 같은 동기화 처리 필요.
 
1. OpenPerformanceData 함수 구현
각종 초기화를 위한 함수
이 DLL을 사용하는 소비자 서비스마다 처음 호출시 한번씩 호출됨.
(모든 소비자 서비스에 대해 한번만 수행하려면 직접 로직구현 필요.
 :전역변수로 함수호출시마다 카운팅을 한다던지..)
 
extern "C" DWORD APIENTRY OpenPerformanceData(LPWSTR pContext)
{
//pContext는 레지스트리에 등록한 Export 값. 등록된 값이 없으면 항상 NULL
}
 
2. CollectPerformanceData 함수 구현
성능 데이터를 요청할때 데이터를 보내주기 위한 함수
함수 인자에 데이터를 넣어주면 됨
 
extern "C" DWORD APIENTRY CollectPerformanceData(
LPWSTR pQuery, /*RegQueryValueEx(HKEY_PERFORMANCE_DATA, "qQuery"); 같이
  성능 데이터 조회시 들어오는 널 종료 문자열인 쿼리 */
   LPVOID* pData, //PERF_OBJECT_TYPE 구조체 형식으로 전달할 성능 데이터를 넣어줌
   LPDWORD pcbData, //pData의 byte 길이. 8 byte 단위로 pData에 넣은 데이터 크기를 넣어줌.
   LPDWORD pObjectsReturned) //pData에 세팅될 오브젝트 개수
{
}
 
3. ClosePerformanceData 함수 구현
소비자 서비스에서 레지스트리 키를 닫을때 호출됨.
 
extern "C" DWORD APIENTRY ClosePerformanceData(void);
 
4. 함수 Export
.DEF 파일로 정의하던가 혹은 소스 하단에 다음과 같이 export
#pragma comment(linker, "/export:Open=_Open@4")
#pragma comment(linker, "/export:Collect=_Collect@16")
#pragma comment(linker, "/export:Close=_Close@0")
 
위 함수에서 에러를 리턴할 경우 이벤트 로그에 기록된다.
 
4. 제거방법 c:\> unlodctr "서비스명" 
"HKEY_LOCAL_MACHINE\\SYSTEM\CurrentControlSet\\Service\\서비스이름" 레지스트리 키 삭제
 
 
 
 
Performance Registry 관련 콘솔 툴
lodctr.exe
: perflib 레지스트리의 정보를 업데이트 (cmd에서 실행)
ex) 파일에 기술한 성능 카운터 추가
c:> lodctr perflib.ini
 
ex) perf 레지스트리 정보를 perflib.txt 파일에 저장
c:\>lodctr /s:perflib.txt
 
ex) perflib.txt 파일 내용을 perf 레지스트리에 저장
c:\>lodctr /r:perflib.txt
 
unlodctr.exe
: 특정 서비스의 관련 레지스트리 삭제(공백있을 경우 따옴표 사용)
ex) 
c:\>unlodctr WmiApRpl
 
변경되는 레지스트리 값 ("c:\>unlodctr WmiApRpl" 실행시)
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\
    CurrentVersion\\Perflib\\012"와 "009"의 Counter, Help 값에서 해당 서비스의 
    카운터, 헬프 숫자가 제거됨.
 
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib"의
    삭제된 카운터가 마지막에 해당할 경우 Last Counter, Last Help 값이 갱신됨.
 
"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WmiApRpl\\Performance"
    의 First Count, First Help, Last Counter, Last Help, Object List 값 삭제됨
 


그 외 관련 자료
PERF_OBJECT_TYPE 에 대한 설명이 있는 글
 
WMI (windows management instrumentation)
 


'C++' 카테고리의 다른 글

[MFC] splitter UI 바꾸기  (0) 2010.12.09
[MFC] CTreeView에 바탕화면 폴더 트리 생성 예제  (0) 2010.12.03
[MFC] 인터넷 HTML 소스 다운로드  (1) 2010.12.01
윈도우 서비스 (service)  (0) 2010.11.25
MiniDump (미니 덤프 생성하기)  (0) 2010.11.13
Memory Pool (메모리 풀)  (1) 2010.11.13
virtual 와 상속 속성  (0) 2010.11.10
stable priority queue  (0) 2010.11.08