VPS 호스팅 업체 대부분이 사용하는 가상화 기술이 KVM입니다. 표면적으로는 “VM을 띄우는 도구”이지만, 내부 구조를 알면 같은 하드웨어에서 두 배의 성능을 끌어낼 수 있습니다.
KVM이란
KVM(Kernel-based Virtual Machine)은 리눅스 커널 자체를 하이퍼바이저로 만드는 모듈입니다. 2007년 메인라인에 병합되어 현재 RHEL·Ubuntu·Proxmox·oVirt 등 거의 모든 리눅스 가상화의 기반입니다.
다른 하이퍼바이저와의 차이
| 종류 | 대표 | 특징 |
|---|---|---|
| Type-1 (베어메탈) | VMware ESXi, Hyper-V, Xen | 호스트 OS 없이 직접 하드웨어 위 |
| Type-2 (호스트형) | VirtualBox, VMware Workstation | OS 위에 가상화 |
| KVM | 리눅스 커널 = 하이퍼바이저 | 위 두 분류의 경계 — 사실상 Type-1 |
KVM은 일반 리눅스 커널을 그대로 쓰면서 가상화를 한다는 점에서 독특합니다. 호스트 리눅스의 모든 도구(NUMA·cgroup·perf·eBPF)를 그대로 활용할 수 있습니다.
스택 구성 요소
사용자: virsh / cockpit / Proxmox / OpenStack
↓
libvirt: 통합 관리 API
↓
QEMU (각 VM당 1프로세스):
- 디바이스 에뮬레이션
- 디스크·NIC 인터페이스 제공
↓
KVM 커널 모듈 (kvm.ko + kvm-intel/amd.ko):
- VMX/SVM 하드웨어 가상화 호출
↓
호스트 리눅스 커널
↓
하드웨어 (CPU의 VT-x/AMD-V)
각 VM은 호스트 입장에서 하나의 QEMU 프로세스로 보입니다. ps·top·cgroup으로 일반 프로세스처럼 관리됩니다.
하드웨어 가상화 — VMX/SVM
KVM이 빠른 이유는 CPU가 직접 가상화를 도와주기 때문입니다.
- Intel: VT-x (VMX)
- AMD: AMD-V (SVM)
게스트 OS의 명령어 중 권한 있는 명령은 CPU가 자동으로 가로채 KVM에 넘깁니다(VM-Exit). 이 과정이 하드웨어 가속이라 소프트웨어 에뮬레이션보다 수십 배 빠릅니다.
게스트 메모리 가상화는 EPT(Intel) / NPT(AMD) 라는 2단계 페이지테이블로 가속됩니다. 게스트의 가상 주소 → 게스트 물리 → 호스트 물리 변환이 CPU 차원에서 처리됩니다.
확인:
egrep -c '(vmx|svm)' /proc/cpuinfo
# 0이면 CPU가 가상화 미지원 또는 BIOS에서 꺼져 있음
virtio — 게스트와 호스트의 빠른 인터페이스
전통적 에뮬레이션(e1000 NIC, IDE 디스크)은 실제 하드웨어를 흉내내야 해 느립니다. virtio는 “가상화를 알고 있는” 게스트 드라이버와 호스트 인터페이스의 표준입니다.
| 디바이스 | virtio 종류 | 처리량 향상 |
|---|---|---|
| 네트워크 | virtio-net | 2~10배 |
| 블록 디스크 | virtio-blk | 3~5배 |
| SCSI | virtio-scsi | virtio-blk + 다양한 기능 |
| 메모리 풍선 | virtio-balloon | 동적 메모리 조정 |
| 콘솔 | virtio-console | 빠른 시리얼 |
| GPU | virtio-gpu | 그래픽 가속 |
| 9P FS | virtio-9p | 호스트 FS 공유 |
게스트 OS는 virtio 드라이버를 설치해야 하며, 리눅스는 기본 포함, Windows는 별도 설치 필요(virtio-win 드라이버).
virtio가 활성화된 NIC 확인:
# 게스트 안에서
lspci | grep -i virtio
# Virtio network device, Virtio block device 등
IOMMU와 GPU/디바이스 패스스루
IOMMU(Input/Output MMU)는 디바이스(NIC·GPU·NVMe)의 DMA 접근을 가상화하는 하드웨어 기능입니다. Intel은 VT-d, AMD는 AMD-Vi라고 부릅니다.
IOMMU가 있으면 다음이 가능합니다.
1) PCIe 디바이스 패스스루
GPU·NVMe·NIC을 통째로 VM에 넘겨 거의 베어메탈 성능을 냅니다. GPU 가상화의 핵심.
# GRUB에 IOMMU 활성화
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"
# IOMMU 그룹 확인
find /sys/kernel/iommu_groups/ -type l
2) SR-IOV
물리 NIC을 가상 함수(VF)로 분할해 여러 VM이 직접 사용. 네트워크 성능 극대화.
3) 보안 격리
악의적 VM이 DMA로 호스트 메모리를 침해하는 것을 차단.
메모리 관리 — Ballooning, KSM, Huge Pages
Ballooning
게스트에서 사용하지 않는 메모리를 호스트가 회수해 다른 VM에 재분배. virtio-balloon 드라이버 필요.
VM1 할당 16GB, 실제 사용 8GB
→ balloon이 8GB를 "차지"한 척하고 호스트에 8GB 반환
→ 다른 VM 또는 캐시로 재활용
VM1이 더 필요해지면 balloon이 풀리며 즉시 복귀
KSM (Kernel Same-page Merging)
여러 VM의 동일한 메모리 페이지를 하나로 합쳐 메모리 절약. 같은 OS·앱을 여러 VM이 쓰면 효과 큼.
echo 1 > /sys/kernel/mm/ksm/run
cat /sys/kernel/mm/ksm/pages_sharing # 절약된 페이지 수
Huge Pages
2MB 또는 1GB 단위로 메모리를 매핑해 TLB 미스를 줄임. DB·게임 서버에서 5~15% 성능 향상.
# 4096개의 2MB huge page = 8GB 예약
echo 4096 > /proc/sys/vm/nr_hugepages
# VM 설정에 huge page 사용 명시 (libvirt)
<memoryBacking>
<hugepages/>
</memoryBacking>
CPU 핀과 NUMA
멀티 CPU 서버에서는 VM의 vCPU를 특정 물리 코어에 고정(핀)하면 캐시 효율이 크게 향상됩니다. NUMA 노드 정렬까지 맞추면 더 좋습니다.
<!-- libvirt XML -->
<vcpu placement="static" cpuset="2-3">2</vcpu>
<numatune>
<memory mode="strict" nodeset="0"/>
</numatune>
<cputune>
<vcpupin vcpu="0" cpuset="2"/>
<vcpupin vcpu="1" cpuset="3"/>
</cputune>
자세한 NUMA 튜닝은 NUMA·CPU pinning 글 참고.
디스크 캐시 모드
QEMU의 디스크 캐시 옵션이 성능과 데이터 안전성에 큰 영향을 줍니다.
| 모드 | 게스트 fsync 동작 | 성능 | 안전성 |
|---|---|---|---|
writeback |
호스트 페이지 캐시 사용, 게스트 fsync도 호스트 캐시 | 빠름 | 호스트 정전 시 손실 위험 |
writethrough |
모든 쓰기를 즉시 디스크로 | 느림 | 안전 |
none |
O_DIRECT, 호스트 캐시 우회 | 빠름·예측 가능 | 권장 (DB 워크로드) |
unsafe |
모든 fsync 무시 | 가장 빠름 | 위험, 테스트용 |
<disk type="file" device="disk">
<driver name="qemu" type="qcow2" cache="none" io="native" discard="unmap"/>
...
</disk>
라이브 마이그레이션
VM을 동작 중 다른 호스트로 옮기는 기술. 메모리 페이지를 점진적으로 복사하면서 마지막 짧은 정지(수 십~수 백 ms) 후 새 호스트에서 재개합니다.
# 같은 디스크(공유 스토리지) 환경
virsh migrate --live my-vm qemu+ssh://target-host/system
# 스토리지도 함께 이동(라이브 + 디스크 마이그레이션)
virsh migrate --live --copy-storage-all my-vm qemu+ssh://target-host/system
전제 조건:
- 양쪽 호스트의 CPU가 호환 (벤더 같음·기능 비슷)
- 네트워크 충분한 대역폭 (메모리 크기에 비례)
- 공유 스토리지 또는 storage copy 옵션
- 같은 가상 네트워크
보안 강화
게스트 탈출(VM escape)은 KVM의 가장 큰 위험입니다.
1) seccomp 필터
QEMU 프로세스의 시스템콜을 제한. 게스트가 QEMU를 통해 호스트 커널을 공격하는 표면을 줄임.
2) SELinux/AppArmor
sVirt가 각 QEMU 프로세스를 격리된 SELinux 라벨로 실행.
3) seccomp + namespace + cgroup
컨테이너처럼 QEMU를 격리.
4) Confidential VMs (AMD SEV, Intel TDX)
하이퍼바이저조차도 게스트 메모리를 볼 수 없도록 암호화. 호스트가 신뢰할 수 없는 환경에서 중요.
호스팅 사업자 입장의 KVM 최적화
Overprovisioning 비율
- CPU: 보통 2~4배 (1 코어를 2~4 vCPU로) — 워크로드에 따라
- RAM: 보통 1배 (overprovisioning 위험)
- 디스크: thin provisioning으로 압축
리소스 격리
cgroup으로 VM별 CPU·메모리·I/O 제한:
<cputune>
<quota>50000</quota>
<period>100000</period> <!-- 50% CPU 제한 -->
</cputune>
<blkiotune>
<weight>500</weight>
</blkiotune>
모니터링
- VM 단위:
virsh domstats, libvirt metrics - 호스트 단위: Prometheus + node_exporter + libvirt_exporter
- KVM 이벤트:
perf kvm stat
마무리
KVM은 호스팅 인프라에서 가장 검증된 가상화 기술이자, 가장 깊이 튜닝할 수 있는 옵션입니다. virtio, IOMMU, CPU 핀, 캐시 모드 네 가지를 정확히 설정하는 것만으로 같은 하드웨어에서 30~50% 성능 향상이 가능합니다.
TCP-80.NET의 VPS는 KVM 기반에 virtio·NUMA 정렬·huge page를 사전 적용해 출고됩니다. 자체 KVM 호스트 운영에 대한 문의는 @tcp80net으로 부탁드립니다.