2008년 12월 11일 목요일

Winmgmt(WmiPrvSE.exe) & wmiApSrv 의 메모리 문제 on Vista, Windows Server 2008

Windows Server 2008 에서도 동일하게, WMI 를 이용해서 성능 카운터 정보를 얻을수 있습니다. 그런데, 이상하게도 WmiPrvSE.exe 프로세스의 메모리 점유율이 비정상적으로 높은것을 알수 있습니다. (* 같은 코드 기반인 Vista 에서도 동일할듯....)

이러한 문제는, 이전 Windows 2000 에서 발생했던 적이 있었으며,. 추후 패치가 제공 되었습니다. 그리고 그 이후의 Windows 2000 과 Windows Server 2003 에서는 동일한 문제가 발생하지 않고 있습니다.

모니터링 도구를 실행하면 Winmgmt.exe에서 메모리가 누수된다
http://support.microsoft.com/kb/811772

이러한 문제?를 확인할 수 있었던 이유는, 운영중인 서버중 Windows Server 2008 이 몇대가 존재하고 있으며 기존에 Windows 2000, Windows Server 2003 을 모니터링 하기 위한 윈도우 서비스를 Windows Server 2008 에서도 작동 하도록 코드 수정 및 테스트 과정에서 WmiPrvSE.exe 의 비정상적인 메모리 점유를 확인 한것  입니다.

이 포스트에서는 해결책을 제시하지 않으며, 프로세스 내부적인 작동상의 문제로 추정되고 있으므로 추후 Microsoft 의 패치 업데이트 외에는 현재 개선할 방법은 없을것 같습니다.

최초 Windows Management Instrumentation(Winmgmt) 서비스를 시작하고, 성능 카운터 정보외에 다른 클래스에서의 쿼리시에는 시작시 점유했던 메모리 양과 거의 변화를 보지 않습니다.

Name: WmiPrvSE.exe (System 계정)
ExecutablePath: C:\Windows\system32\wbem\wmiprvse.exe
Handle: 6128
HandleCount: 139
OSName: Microsoft® Windows Server® 2008 Standard .....
PageFileUsage(KB): 3344
PeakPageFileUsage(KB): 4116
PeakVirtualSize: 42606592
WorkingSetSize(Byte): 6602752
PeakWorkingSetSize(KB): 6460
ProcessId: 6128
ThreadCount: 5
UserModeTime: 936006

위 값을 보면,. 약 6M 선 이며,
이후 여타 클래스에서 쿼리를 하더라도 보통 7M 내외를 점유 합니다.

이때,. 성능 카운터중, CPU 사용량을 얻기 위해서 다음과 같은 성능 카운터 클래스를 호출하는 vbscript 를 실행하면,.

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

Winmgmt 는 성능 카운터 정보를 얻기 위해서 WMI Performance Adapter(wmiApSrv) 를 호출하고 wmiApSrv 는 요청된 성능 카운터 정보를 반환하게 됩니다.

이후의 WmiPrvSE.exe 메모리 점유를 보면, 다음과 같으며

Name: WmiPrvSE.exe
HandleCount: 585
PageFileUsage(KB): 23668
PeakPageFileUsage(KB): 23668
PeakVirtualSize: 111034368
WorkingSetSize(Byte): 30457856
PeakWorkingSetSize(KB): 29744
ProcessId: 6128
ThreadCount: 13
UserModeTime: 12324079
VirtualSize: 111034368

계속해서 성능 카운터 클래스를 호출하면, 메모리 점유율이 조금씩 조금씩 늘어나게 됩니다. 그러나 더 이상 성능 카운터 클래스를 호출하지 않으면 wmiApSrv 서비스가 종료되고 이후 약간의(1~3M정도) 메모리 를 반환하지만  더 이상은 반환하지 않습니다.

그러나 쿼리가 몇일동안 계속 되는 경우, 메모리 점유는 400~500M 를 점유하게 되며 그때의 경우에는 성능 카운터 관련 클래스 호출에 대해서 성능 카운터 관련 클래스가 없어지는 비정상적인 작동을 하게 됩니다.

댓글 없음:

댓글 쓰기

HttpClient 에서 비동기 호출시 System.Threading.Tasks.Task 오류

client.PostAsync().Result; 하나 이상의 오류가 발생했습니다., 위치: System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 이 요청을...