메모리 가상화
더 많은 작업
- Memory Virtualization; 메모리 가상화
- 하이퍼바이저가 실제 물리 메모리를 여러 가상 머신에 나눠 주면서, 각 게스트에게는 0번지부터 시작하는 자기만의 물리 메모리가 있는 것처럼 보이게 하는 기술
운영체제는 원래 하드웨어의 물리 메모리 전체를 자기가 관리한다고 가정한다. 가상 머신 여러 대가 한 서버에서 돌면 각 게스트 운영체제가 모두 이렇게 생각하므로, 하이퍼바이저가 그 사이에서 주소를 한 번 더 바꿔 주고 실제 메모리를 나눠 줘야 한다. 이것이 메모리 가상화다. 운영체제의 가상 메모리가 프로세스마다 독립된 주소 공간을 주는 것처럼, 메모리 가상화는 가상 머신마다 독립된 '물리' 메모리를 준다.
ADP 교재는 클라우드 인프라 기술을 CPU 가상화, 메모리 가상화, I/O 가상화로 나눠 설명한다.
가상화 환경에서는 주소가 세 단계로 나뉜다.
| 주소 | 약어 | 의미 | 누가 관리하나 |
|---|---|---|---|
| 게스트 가상 주소 | GVA | 게스트 안의 프로세스가 쓰는 주소 | 게스트 OS의 페이지 테이블 |
| 게스트 물리 주소 | GPA | 게스트 OS가 물리 메모리라고 믿는 주소. 실제로는 하이퍼바이저가 만든 추상화 | 하이퍼바이저 |
| 호스트 물리 주소(머신 주소) | HPA | 실제 하드웨어 메모리의 주소 | 하이퍼바이저 |
변환 흐름은 GVA → GPA → HPA이다. 앞 단계(GVA→GPA)는 게스트 OS가, 뒤 단계(GPA→HPA)는 하이퍼바이저가 맡는다. VMware ESX 논문은 실제 하드웨어 메모리를 '머신 주소(machine address)', 가상 머신에게 보여 주는 추상화를 '물리 주소(physical address)'라고 부르고, 게스트의 물리 페이지 번호(PPN)를 머신 페이지 번호(MPN)로 바꾸는 pmap 자료 구조를 하이퍼바이저가 유지한다고 설명한다. 리눅스 KVM 문서도 gva, gpa, hpa라는 같은 구분을 쓴다.
CPU의 MMU는 원래 한 단계 변환(가상 → 물리)만 할 줄 알았다. 그래서 하드웨어 지원이 없던 시절 하이퍼바이저는 섀도 페이지 테이블(shadow page table)을 썼다.
- 하이퍼바이저가 GVA를 곧바로 HPA로 바꾸는 별도의 페이지 테이블(섀도 페이지 테이블)을 만들어 실제 MMU에 넣는다.
- 게스트 OS가 자기 페이지 테이블을 고치면 하이퍼바이저가 이를 가로채, 섀도 페이지 테이블도 같이 고친다.
- 장점: 평소의 메모리 접근은 하드웨어가 한 번에 변환하므로 추가 부담이 없다.
- 단점: 게스트가 페이지 테이블을 고칠 때마다 가로채야 하므로, 새 프로세스를 만드는 것처럼 페이지 테이블 변경이 잦은 작업에서 비용이 크다. Xen 논문도 이 점을 전가상화의 단점으로 지적했다.
반가상화를 쓰는 Xen은 섀도 페이지 테이블 대신 게스트의 페이지 테이블을 MMU에 직접 등록하되 게스트는 읽기만 하게 하고, 변경은 하이퍼콜로 받아 검증한 뒤 반영한다.
CPU 제조사는 두 단계 변환을 하드웨어가 직접 하도록 기능을 추가했다.
- Intel EPT(Extended Page Tables), AMD NPT(Nested Page Tables, AMD는 RVI라고도 부름). 리눅스 KVM 문서는 이 둘을 업체 중립적으로 TDP(two dimensional paging, 2차원 페이징)라고 부른다.
- 게스트 페이지 테이블은 GVA→GPA를, 그 아래에 추가된 EPT/NPT 테이블은 GPA→HPA를 맡고, 하드웨어가 둘을 이어서 변환한다.
- VirtualBox 문서에 따르면 중첩 페이징을 쓰면 게스트가 하이퍼바이저의 개입 없이 페이징을 처리할 수 있어 VM exit와 페이지 테이블 접근에 따른 부담이 없어지고 가상화 성능이 크게 좋아진다. AMD는 Barcelona(K10) 아키텍처부터, Intel은 Core i7(Nehalem)부터 이 기능을 넣었다.
- 대신 TLB 미스가 나면 두 단계 테이블을 모두 따라가야 하므로 미스 한 번의 비용은 커진다. 큰 페이지(large page)를 함께 쓰면 TLB 부담을 줄일 수 있다.
| 항목 | 섀도 페이지 테이블 | 하드웨어 보조(EPT/NPT) |
|---|---|---|
| 변환 주체 | 하이퍼바이저가 GVA→HPA 테이블을 만들어 유지 | 하드웨어가 두 단계 테이블을 차례로 따라감 |
| 게스트 페이지 테이블 변경 | 하이퍼바이저가 가로채 동기화(비용 큼) | 게스트가 자유롭게 변경(개입 없음) |
| TLB 미스 비용 | 한 단계 변환이라 작음 | 두 단계를 따라가므로 큼 |
| 하드웨어 요구 | 없음 | EPT 또는 NPT를 지원하는 CPU |
가상 머신들에 나눠 준 메모리의 합이 실제 물리 메모리보다 큰 상태를 메모리 오버커밋(overcommit)이라 한다. 모든 가상 머신이 늘 메모리를 다 쓰지는 않으므로, 하이퍼바이저는 덜 쓰는 곳에서 메모리를 거둬 필요한 곳에 준다. VMware ESX 논문(Waldspurger, OSDI 2002)이 소개한 기법이 대표적이다.
| 기법 | 원리 | 특징 |
|---|---|---|
| 벌루닝(ballooning) | 게스트 안에 벌룬 드라이버를 둔다. 하이퍼바이저가 메모리를 거두려 하면 벌룬을 부풀린다(inflate). 즉 드라이버가 게스트 메모리를 할당받아 고정해 두고, 그 페이지 번호를 하이퍼바이저에 알리면 하이퍼바이저가 해당 머신 페이지를 회수한다. 메모리가 남으면 벌룬을 줄여(deflate) 게스트에 돌려준다. | 메모리가 부족해진 게스트 OS가 자기 정책으로 덜 중요한 페이지를 내보내므로, 무엇을 내보낼지를 가장 잘 아는 게스트가 판단하게 된다 |
| 페이지 공유(content-based page sharing) | 내용이 똑같은 페이지(같은 OS·같은 프로그램의 코드 등)를 해시로 찾아 비교한 뒤 한 장만 남겨 여러 가상 머신이 함께 쓰게 하고, 누군가 쓰려 하면 그때 복사(copy-on-write)한다. | 같은 OS를 쓰는 가상 머신이 많을수록 절약 효과가 크다. 리눅스 KSM(Kernel Samepage Merging)도 같은 원리로, KVM에서 더 많은 가상 머신을 메모리에 올리려고 개발되었다 |
| 하이퍼바이저 스와핑 | 하이퍼바이저가 가상 머신의 메모리 일부를 디스크의 스왑 영역으로 내보낸다. | 확실하게 메모리를 거둘 수 있지만, 게스트가 어떤 페이지가 중요한지 모르는 채로 내보내므로 성능 저하가 크고, 게스트와 하이퍼바이저가 같은 페이지를 이중으로 페이징하는 문제가 생길 수 있다. 그래서 마지막 수단으로 쓴다 |
| 유휴 메모리 세금(idle memory tax) | 활발히 쓰지 않는 메모리를 많이 가진 가상 머신에서 먼저 메모리를 거둔다. | ESX 논문이 제안한 배분 정책 |
ESX 논문에 따르면 시스템은 남은 메모리 양에 따라 단계를 나누어, 여유가 줄면 먼저 벌루닝으로 회수하고 벌루닝이 불가능할 때만 페이징(스와핑)을 쓰며, 메모리가 더 부족해지면 페이징으로 강제로 회수한다. 벌루닝은 오늘날 KVM 등에서도 쓰이며, virtio 명세에도 메모리 벌룬 장치가 정의되어 있다.
- 주소 변환 단계(게스트 가상 → 게스트 물리 → 호스트 물리)와 각 단계를 누가 관리하는지 구분한다.
- 섀도 페이지 테이블은 소프트웨어 방식, EPT(Intel)·NPT(AMD)는 하드웨어 보조 방식이라는 짝을 기억한다.
- 메모리 오버커밋을 가능하게 하는 기법으로 벌루닝, 페이지 공유, 스와핑을 알고, 벌루닝은 게스트 안의 드라이버를 이용한다는 점을 구분한다.
- ADP 교재 분류로는 CPU 가상화, I/O 가상화와 함께 클라우드 인프라 기술의 세 요소 가운데 하나이다.
- Waldspurger, C. A. (2002). Memory Resource Management in VMware ESX Server. OSDI 2002 - USENIX
- Memory Resource Management in VMware ESX Server (논문 PDF, USENIX)
- The Linux Kernel documentation - The x86 kvm shadow mmu
- The Linux Kernel documentation - Kernel Samepage Merging
- Oracle VirtualBox User Manual - Technical Background (Nested Paging and VPIDs)
- Barham, P. et al. (2003). Xen and the Art of Virtualization. SOSP 2003
- OASIS - Virtual I/O Device (VIRTIO) Version 1.2