가상 머신의 메모리는 어디로 갔을까? 게스트 OS 메모리 오버커밋 감지법
VMware ESXi나 Hyper-V 같은 가상화 호스트에서 가상 머신(VM)을 운영하며 성능 문제를 분석하다 보면, 게스트 OS가 인식하는 사용 가능한 메모리 크기와 실제 상황이 크게 어긋나는 경우를 자주 만나게 됩니다. 예를 들어 가상 머신에 8GB의 메모리를 할당했는데, 작업 관리자는 1GB가 여유 있다고 표시하는 반면 실제 실행 중인 프로세스들이 소비하는 메모리는 3GB도 되지 않는 경우입니다. 그렇다면 나머지 4GB는 대체 어디로 간 것일까요?
이러한 현상은 대부분 하이퍼바이저의 메모리 오버커밋(Memory Overcommit) 기능 때문에 발생합니다.
메모리 오버커밋이란 무엇인가?
메모리 오버커밋은 물리 호스트에 실제 존재하는 용량보다 더 많은 메모리를 가상 머신들에 할당할 수 있게 해주는 하이퍼바이저 기능입니다. 단, 특정 시점에 요청된 모든 메모리를 할당해 줄 수 있다는 보장은 없습니다. 이 기능을 활용하면 현재 호스트의 부하 상태에 따라 유휴 상태의 VM에서 메모리를 회수해 부하가 높은 VM에 재분배함으로써, 제한된 물리 메모리를 훨씬 밀도 높게 운영할 수 있습니다.
VMware에서 메모리 오버커밋을 구현하는 대표적인 메커니즘이 메모리 발루닝(Memory Ballooning)이며, Hyper-V에서는 동일한 기능을 동적 메모리(Dynamic Memory)로 구현하고 있습니다.
참고: VMware와 Microsoft 양사 모두 메모리 압축(Memory Compression) 기술을 폭넓게 활용해 메모리 자원을 절약하고 있는데, 이 역시 메모리 오버커밋 기술의 한 구현 방식입니다.
VMware ESXi에서 메모리 오버커밋(발루닝)은 VMware Tools에 포함된 vmmemctl.sys 드라이버가 담당합니다. 이 드라이버는 필요 시 게스트 OS 내부에 가짜 프로세스를 생성하는 방식(마치 풍선에 바람을 불어넣듯이)으로 물리 메모리를 점유합니다. 그 결과 해당 메모리는 게스트 OS의 다른 애플리케이션이 사용할 수 없게 되며, 하이퍼바이저는 확보한 여유 메모리를 다른 VM들에 배분할 수 있습니다. Hyper-V 동적 메모리의 경우에는 통합 서비스의 dmvsc.sys(Dynamic Memory VSC 구성 요소) 드라이버가 같은 역할을 수행합니다. 메모리 오버커밋 설정은 하이퍼바이저 관리자가 관리합니다.
게스트 VM 내부에서 메모리 오버커밋 확인하기
그렇다면 게스트 VM 내부에서, 게스트 OS가 인식하는 것보다 실제 사용 가능한 물리 메모리가 적다는 사실을 어떻게 확인할 수 있을까요?
Windows 게스트 OS에서 발루닝 드라이버의 존재 여부와 점유 크기를 파악하는 방법을 실제 예시를 통해 살펴보겠습니다.
Windows Server 2012 R2가 설치된 VM에 8GB의 메모리가 할당되어 있다고 가정해 보겠습니다. 작업 관리자는 메모리 사용률이 93%(7.4GB 사용)라고 표시하지만, 실행 중인 모든 프로세스의 메모리 사용량을 합산해 보면 실제로는 2.5GB 정도만 사용되고 있음을 알 수 있습니다. 그렇다면 나머지 5GB는 어디에 있는 걸까요? 작업 관리자도 리소스 모니터도 이 질문에는 답해 주지 못합니다.

메모리 상태를 정확히 진단하려면 Mark Russinovich가 개발한 RamMap 도구를 사용해야 합니다. Microsoft 웹사이트(https://technet.microsoft.com/en-us/library/ff700229.aspx)에서 도구를 내려받아 관리자 권한으로 실행한 뒤 Use Counts 탭을 확인하면, 전체 메모리의 상당 부분(5.4GB)이 Driver Locked 항목에 의해 사용 중인 것을 확인할 수 있습니다.

이것이 바로 하이퍼바이저가 게스트 OS 내부의 발루닝 드라이버를 통해 점유한 후 다른 가상 머신들에 배분한 메모리입니다. 즉, 하이퍼바이저 호스트의 물리 메모리가 부족하거나, 관리자가 해당 VM에 메모리 제한 정책을 적용하고 있다는 의미입니다.
Hyper-V 및 VMware에서의 조치 방법
Hyper-V에서는 성능 모니터(Performance Monitor)의 다음 성능 카운터를 통해 현재 VM의 메모리 통계를 확인할 수 있습니다.
- Hyper-V Dynamic Memory → Guest Visible Memory
- Hyper-V Dynamic Memory → Physical Memory
이러한 동작을 비활성화하려면 하이퍼바이저 관리자가 VM의 Hyper-V 설정에서 "동적 메모리 사용(Enable Dynamic Memory)" 옵션을 해제하거나, 최소 메모리 예약 값을 상향 조정해야 합니다.

VMware ESXi 호스트를 사용하는 경우에는 VM 설정의 Resource Settings에서 해당 가상 머신에 더 많은 메모리를 예약하거나, "Reserve all guest memory (All locked)" 옵션을 통해 게스트 메모리 전체를 예약할 수 있습니다.
