VPS 호스팅 업체 대부분이 사용하는 가상화 기술이 KVM입니다. 표면적으로는 “VM을 띄우는 도구”이지만, 내부 구조를 알면 같은 하드웨어에서 두 배의 성능을 끌어낼 수 있습니다.

KVM 가상화 스택


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으로 부탁드립니다.