[vSphere] 하드웨어의 가상화 – 메모리

  • Hypervisior에서 사용하는 메모리는 ESXi서버의 경우 VMkernel이 모두 가져가게 되며, ESX서버의 경우는 VMkernel과 서비스 콘솔이 가져 갑니다(서비스 콘솔에서의 기본 메모리영역 300MB를 제외하고는 모두 VMkernel이 가져갑니다.)
가상메모리는 실제 물리적 메모리보다 더 많은 메모리를 사용할 수 있도록 해주는 것입니다.
많이 들어본 스왑(Swap) 메모리가 가상메모리입니다.

  • VMkernel은 모든 Virtual Machine들이 실제로 자신은 연속된 물리적인 메모리를 가지고 있다는 착각을 주어야합니다.
그리고 게스트 가상 메모리 주소의 위치가 최종적으로는 호스트(실제 서버)물리 메모리의 어떤 위치에 해당하는지에 대한 주소 매핑 작업을 해야만 하기 때문에, 또 다른 주소 매핑을 도울 테이블이 필요하게 됩니다. 그 테이블이, vSphere서버(ESX)에서는 Shadow Page Table이라고 부릅니다.
Shadow Page Table을 통해 게스트 가상 메모리 – 게스트 물리 메모리, 게스트 물리 메모리 – 호스트 물리 메모리간의 매핑이 이루어지게 됩니다.


대략 매핑관계가 이렇습니다.
– TLB(Translation Lookaside Buffer) 캐시는 직접 Shadow Table을 뒤져서 게스트 가상 메모리에서 호스트 물리 메모리까지의 매핑 주소 값을 직접읽게되어, 일반적인 가상화의 메모리 주소 매핑에 따른 어려움을 해결할 수 있게 되었습니다.
Shadow Table Page를 통해 실제 게스트 가상 메모리와 호스트 물리 메모리 간의 매핑에 대한 어려움이 해결됐지만, 수 많은 Virtual Machine이 제한된 호스트 시스템의 물리적인 메모리를 좀 더 효과적으로 사용하고자 하는 노력은 오히려 Memory Over-commiment와 같은 기술로 빛을 발합니다.
(Memory Over-commiment가 의미하는 기능은 물리적으로 메모리 크기가 제한된 시스템 위에 전체 가상 머신의 메모리 합이 더 초과되더라도 정상적으로 운영할 수 있게끔 해주는 것입니다)

  • vSphere서버(ESX)는 메모리 오버커밋 기능을 크게 세 가지 방법으로 지원을 하게 됩니다
  1. Transparent Page Sharing
: 호스트 시스템 위에 작동중인 다수의 가상 머신들 대부분이 동일한 게스트 운영체제를 실행하는 조건이라면,
그 안에서 필수적으로 항상 실행되는 기본적인 DLL,EXE들과 같은 파일내용들은 동일하게 됩니다.
이러한 내용들을 함께 공유하여 물리적 메모리 공간을 좀 더 효율적으로 사용할 수 있게 하는 것입니다.
동작 방식은, 작동중인 가상 머신중 몇몇을 선택하고 게스트 물리 메모리의 내용을 기반으로 한 Hash값을 뽑아내어 
그것을 기준으로 호스트 물리 메모리 페이지중 동일한 내용이 담겨 있는지 비교하게 됩니다.
 만약, Hash값과 동일한 엔트리 내용이 발견된다면 매우 정밀하게 Page전체를 스캔하여 내용이 완전히 일치하는지 확인을 하고
 일치한다면 VMkernel은 해당 가상머신이 공유 메모리 페이지를 바라보게끔 게스트 물리 메모리와 호스트 물리 메모리 간의 매핑주소를 바꾸게 되며, 원래 자리를 차지하던 호스트 물리 메모리 페이지는 비워버리고 그만큼 공간을 확보하게 됩니다.
    만약, 동일한 공유 메모리 페이지를 보고 있다가 어느 한쪽의 가상 머신에서 실제 해당 메모리 페이지 내용에 변경이 생기면
 VMkernel은 변경(업데이트)이 일어난 해당 가상머신을 위한 메모리 페이지를 새롭게 생성하여 올바른 메모리 페이지 주소를 바라볼 수 있도록 다시 매핑주소 값을 변경해주게 됩니다.

  2. Memory Ballooning
: vSphere서버에서 작동되는 가상머신에는 각종 유틸, 드라이버가 담겨 있는 VMware Tools를 설치하게 되는데 이 안에는 ‘vmmemctl’이라는 메모리 컨트롤러 드라이버가 같이 설치되게 됩니다.
이 드라이버는 VMkernel과 Private채널을 생성하여 통신을하며 서로간의 메모리 상태를 파악하고 각종 정보를 주고 받게 됩니다. 
호스트의 전체 물리적인 메모리 크기가 부족할 경우 VMkernel은 가상머신들 안에 설치된 메모리 컨트롤러 드라이버에게 명령을 내려 게스트 OS 내부의 메모리를 팽창시키도록하여 메모리 점유율을 올리게 됩니다. 게스트 OS는 아무 이유없이 늘어가는 메모리 점유율을 줄이기 위해 자신의 Swapping 알고리즘을 이용하여 메모리 내용들은 가상 메모리 쪽으로 페이지 아웃시키게 됩니다. 메모리 컨트롤러 드라이버는 이렇게 비워진 메모리 페이지 위치를 VMkernel에게 알려주고, VMkernel은 그 위치에 해당하는 호스트 물리 메모리 주소를 비우게 되어, 물리 메모리의 공간을 확보하게 됩니다.
    이후에, 호스트 물리 메모리에 여유가 생긴다면 반대로 명령을 내려 메모리를 수축시키는 명령을 내립니다.

 

  1. Hypervisior Swapping
: Translation Page Sharing, Memory Ballooning 기법을 통해서도 호스트 물리 메모리의 공간 부족이 해결되지 않는 다면 최종적으로 하이퍼바이저 스와핑 기법을 사용하게 됩니다.
기본적으로 가상머신이 시작될 때 vSphere서버는 각 가상머신에게 할당된 메모리 크기만큼 동일한 스왑 파일을 생성합니다.
 호스트 물리 메모리 공간이 심할 경우, 직접 가상머신의 게스트 물리 메모리를 스와핑 하면서 전체적으로 모든 가상머신들을 위해서 호스트 물리 메모리의 공간을 확보하게 됩니다.
Translation Page Sharing, Memory Ballooning은 최종적으로 메모리의 공간을 확보하기 위해 최적의 알고리즘 계산을 하여 어느정도 시간이 필요하게 되지만 성능에 크게 영향을 주지 않습니다. 
그에 비해 하이퍼바이저 스와핑은 확보할 수 있는 호스트 물리 메로리 공간은 눈에 띄게 영향을 주지만 그 만큼 전체 가상머신의 성능에는 커다란 영향을 주게 됩니다.
    애초에 호스트 물리 메모리가 부족하지 않도록 가상 머신 메모리의 크기를 조절해주는 것이 좋으며 가능하면 하이퍼바이저 스와핑까지 일어나지 않도록 하는 것이 좋습니다.

 

출처: http://1828.tistory.com/entry/vSphere-하드웨어의-가상화-메모리 [6199]

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Videos, Slideshows and Podcasts by Cincopa Wordpress Plugin