Belajar KVM & QEMU - Nested Virtualization & Performance
Episode 19 of 23

Belajar KVM & QEMU - Nested Virtualization & Performance

Mengaktifkan nested virtualization dengan nested=1 untuk KVM di dalam VM, lalu menyetel performa: CPU pinning taskset dan virsh vcpupin, hugepages, KSM memory dedup, dan -cpu host invtsc untuk timing yang akurat

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

VM yang "jalan" belum tentu VM yang kencang. Episode 19 menutup sisi performa dan membuka fitur yang paling banyak diminta praktisi: nested virtualization (KVM di dalam VM — untuk CI/CD dan testing) serta teknik tuning performa kelas produksi — CPU pinning, hugepages, KSM, dan timing presisi.

Pola pikir penting: virtualisasi modern sudah cepat secara default, tetapi default itu dirancang untuk kompatibilitas, bukan kecepatan maksimum. Empat teknik di episode ini adalah perbedaan antara "cukup jalan" dan "mendekati bare-metal".

Nested Virtualization

Nested virtualization berarti menjalankan hypervisor di dalam VM — KVM di dalam KVM. Aktifkan di host lewat modul:

Aktifkan nested virtualization (Intel)
echo 'options kvm_intel nested=1' | sudo tee /etc/modprobe.d/kvm_intel.conf
Aktifkan nested virtualization (AMD)
echo 'options kvm_amd nested=1' | sudo tee /etc/modprobe.d/kvm_amd.conf

Muat ulang modul atau reboot, lalu verifikasi:

Verifikasi nested
cat /sys/module/kvm_intel/parameters/nested   # Y / 1

KVM di Dalam VM

Setelah VM level-1 diberi flag vmx/svm (lewat -cpu host atau -cpu host,migratable=no), di dalam guest:

Di dalam VM (level-1): cek /dev/kvm
grep -E "vmx|svm" /proc/cpuinfo
ls -l /dev/kvm

Jika ada, guest bisa menjalankan KVM sendiri. Di libvirt, ekspos CPU host:

Expose CPU host (libvirt)
<cpu mode='host-passthrough' check='none'>
  <feature policy='require' name='vmx'/>
</cpu>

Tip

Gunakan mode='host-passthrough' saat nested atau akurasi performa lebih penting daripada kompatibilitas migrasi. Untuk VM yang harus bisa live migrate (episode 15), pakai host-model dengan feature set yang terkontrol.

Use case nyata nested: CI runners yang butuh hypervisor sendiri untuk tes (misal GitLab runner menjalankan VM), laboratorium KVM, dan uji coba Proxmox di dalam VM.

CPU Pinning

Secara default, vCPU thread bisa melompat antar core fisik — scheduler mengatur sendiri. Pinning mengunci tiap vCPU ke core spesifik, menjaga cache CPU dan NUMA tetap hangat.

Dengan taskset (uji cepat)

Pin vCPU ke core 0-3
sudo taskset -p -c 0-3 $(pgrep -f qemu-system)

Dengan virsh vcpupin (persisten per VM)

Pin vCPU 0 ke core 0, vCPU 1 ke core 1
virsh vcpupin web1 0 0
virsh vcpupin web1 1 1
virsh vcpupin web1 --list

Di XML, ini tersimpan sebagai <vcpupin>:

VCPU pinning (libvirt)
<cputune>
  <vcpupin vcpu='0' cpuset='0'/>
  <vcpupin vcpu='1' cpuset='1'/>
</cputune>

Hindari mem-pin vCPU dan thread host ke core yang sama (overcommit core) — dua vCPU berebut satu core fisik justru lebih lambat.

Hugepages

Halaman memory Linux default 4K berarti banyak TLB miss untuk VM yang memakai banyak RAM. Hugepages (2M/1G) memotong jumlah entry TLB — I/O dan akses memori lebih cepat.

Alokasi hugepages 2M (contoh 4G)
echo 2048 | sudo tee /proc/sys/vm/nr_hugepages

Agar persisten, set di /etc/sysctl.d/:

Linux/etc/sysctl.d/99-hugepages.conf
vm.nr_hugepages = 2048

Aktifkan di QEMU:

VM dengan hugepages
qemu-system-x86_64 -m 4096 -mem-path /dev/hugepages -mem-prealloc ...

Di libvirt, set memoryBacking:

Memory backing hugepages (libvirt)
<memoryBacking>
  <hugepages/>
</memoryBacking>

-mem-prealloc mengalokasikan halaman di awal agar tidak ada stall saat VM akses memori pertama kali.

KSM: Memory Dedup

KSM (Kernel Samepage Merging) menggabungkan halaman identik antar VM — efektif untuk banyak VM yang menjalankan OS/setting sama (lab, hosting). Aktifkan:

Aktifkan KSM
echo 1 | sudo tee /sys/kernel/mm/ksm/run

Monitor efektivitas:

Statistik KSM
grep -E "pages_shared|pages_sharing" /sys/kernel/mm/ksm/pages_sharing

KSM menghemat RAM, tetapi ada biaya CPU untuk scanning — dan memperkenalkan side-channel timing (teori keamanan). Untuk workload yang memprioritaskan keamanan atau single-VM besar, matikan KSM. Untuk farm VM seragam, aktifkan.

Timing Presisi: -cpu host,invtsc

TSC (Time Stamp Counter) guest yang berubah-ubah saat migrasi/CPUFreq membuat aplikasi time-sensitive (dan beberapa game/DRM) kacau. invtsc membuat TSC invariant dan mengeksposnya ke guest:

VM dengan TSC invariant
qemu-system-x86_64 -cpu host,invtsc ...

Di libvirt, lewat <feature> atau flag host-passthrough yang sudah mencakupnya pada kebanyakan CPU modern. Perhatian: invtsc menempelkan VM ke karakteristik clock host — membatasi migrasi antar CPU berbeda.

Common Pitfalls

  • Nested tanpa flag vmx: guest tidak melihat /dev/kvm karena CPU virtual tidak mengekspos vmx — gunakan host-passthrough.
  • Pinning tanpa NUMA awareness: pin vCPU ke core di socket yang sama dengan memori VM-nya.
  • Hugepages tanpa -mem-prealloc: alokasi lambat saat runtime — crash risk di high load.
  • KSM di lingkungan multi-tenant tidak tepercaya: pertimbangkan risiko side-channel sebelum mengaktifkan.
  • invtsc + migrasi: TSC invariant terkunci ke host — jangan campur dengan migrasi lintas CPU.

Penutup

Pada episode 19 ini, kalian telah menambal dua aspek terakhir performa.

Inti yang harus dibawa pulang:

  • Nested virtualization: nested=1 di kvm_intel/kvm_amd + host-passthrough di guest — untuk CI/testing.
  • CPU pinning: virsh vcpupin (persisten via <vcpupin>) mengurangi jitter scheduler.
  • Hugepages (2M/1G) memangkas TLB miss; kombinasikan dengan -mem-prealloc.
  • KSM menduplikasi halaman antar VM — hemat RAM, sadar biaya CPU & sisi keamanan.
  • -cpu host,invtsc untuk timing presisi; sadari batasannya terhadap migrasi.

Di episode 20 selanjutnya, kita akan membahas QEMU 11.1 & fitur terbaru — apa saja yang berubah di rilis 2026, perbaikan UEFI dan virtio-gpu, kebijakan versioning time-based, stable branches, dan kebijakan deprecation dua rilis. Sampai jumpa di episode 20!

Belajar KVM & QEMU - Nested Virtualization & Performance | Belajar KVM & QEMU