Episode ini menyempurnakan performa dan observasi VM: tuning hugepages, CPU pinning/affinity, dan NUMA awareness, lalu membaca log VMM, metrics, tracing, serta debugging dengan gdb. Kalian belajar mengubah "VM yang jalan" menjadi "VM yang diukur dan dioptimalkan".

Sejauh ini VM kita "jalan". Di episode 20 kita bertanya: seberapa baik jalan-nya? Performa dan observability adalah dua sisi koin yang sama: tanpa pengukuran tidak ada optimasi, dan tanpa observasi tidak ada diagnosis. Di episode ini kita menyetel performa — hugepages, CPU pinning, NUMA awareness — lalu membangun observability — log, metrics, tracing, dan debugging dengan gdb.
Bayangkan performa seperti menyetel mesin mobil: hugepages memperbesar "tangki jalur cepat" (TLB), pinning mengunci pekerja di posisi tetap agar tidak bolak-balik, dan NUMA awareness memastikan data dekat dengan pemrosesnya. Observability adalah dashboard yang menunjukkan semua itu bekerja atau tidak.
Kita sudah menyentuh hugepages di episode 5. Sekarang kita mengoptimalkannya. Alokasi 2 MB halaman mengurangi jumlah entri TLB sehingga memory access lebih cepat:
echo 1024 | sudo tee /proc/sys/vm/nr_hugepages
grep HugePages_Total /proc/meminfoLalu jalankan VM dengan hugepages:
cloud-hypervisor \
--kernel kernel-vmlinux \
--disk path=os.raw \
--cpus boot=4 \
--memory size=4G,hugepages=on,shared=onhugepages=on membuat RAM guest dari pool hugepage host; shared=on dibutuhkan untuk snapshot/migration (episode 10-11). Verifikasi di dalam guest bahwa halaman 2 MB benar-benar dipakai:
grep -i huge /proc/meminfoSecara default, vCPU thread bisa berpindah-pindah CPU fisik. Pinning mengunci setiap vCPU ke CPU fisik tertentu — mengurangi cache thrashing dan context switching, sangat terasa untuk workload latency-sensitive:
cloud-hypervisor \
--kernel kernel-vmlinux \
--disk path=os.raw \
--cpus boot=4 \
--memory size=4G \
--cpu-affinity vcpu:0-3--cpu-affinity vcpu:0-3 memetakan keempat vCPU ke CPU fisik 0-3. Kombinasikan dengan isolcpus di host agar workload lain tidak berebut core tersebut:
isolcpus=2,3,6,7 nohz_full=2,3,6,7 rcu_nocbs=2,3,6,7Pada host multi-socket, memory dekat CPU (NUMA node) jauh lebih cepat diakses daripada yang jauh. Untuk workload memory-intensive, pastikan VM menempel di satu NUMA node, dan guest memetakan topology-nya agar aplikasi bisa menyetel sendiri:
numactl --hardwarecloud-hypervisor \
--kernel kernel-vmlinux \
--disk path=os.raw \
--cpus boot=8,topology="1 socket,8 cores,1 thread" \
--memory size=8G \
--numa guest_numa_id=0,cpus=[0-7],distances=[10,20]Di dalam guest, aplikasi bisa melihat topology dan menyetel alokasinya:
numactl --hardware
numactl --showNote
Tuning adalah trade-off, bukan list yang harus semua diaktifkan. Hugepages membantu memory-intensive tapi menambah overhead manajemen; pinning membantu latency tapi mengurangi fleksibilitas scheduler; NUMA membantu locality tapi membatasi pilihan penjadwalan. Ukur sebelum dan sesudah tiap perubahan.
Cloud Hypervisor menulis log ke stderr secara default. Aktifkan --log-file untuk menyimpan log dan kendalikan levelnya:
cloud-hypervisor \
--kernel kernel-vmlinux \
--disk path=os.raw \
--cpus boot=4 \
--memory size=4G \
--log-file /var/log/ch-vm.log \
--log-level infoLevel yang tersedia: error, warning, info, debug, trace. trace sangat detail (setiap ioctl KVM dan event device) — nyalakan hanya saat debugging.
Saat ada masalah, urutkan dari log:
grep -iE "error|fatal" /var/log/ch-vm.log | tail -20VMM menghasilkan metrics (jumlah VM-exit, disk I/O, network traffic, dll.) yang bisa diekspor untuk monitoring. Siapkan endpoint metrics:
cloud-hypervisor \
--kernel kernel-vmlinux \
--disk path=os.raw \
--cpus boot=4 \
--memory size=4G \
--metrics path=http://localhost:9091/metricsPrometheus bisa men-scrape endpoint ini. Metrik yang berguna misalnya cloud_hypervisor_vm_exits (frekuensi VM-exit) dan cloud_hypervisor_disk_read_bytes. Pantau tren, bukan hanya nilai absolut — lonjakan VM-exit sering menandakan device yang bermasalah.
Untuk analisis mendalam, aktifkan tracing (misal memakai perf di host untuk vCPU thread):
perf record -e kvm:kvm_exit -g -- pid=$(pgrep -f cloud-hypervisor)
perf reportperf kvm menampilkan distribusi penyebab VM-exit — apakah dominan I/O, timer, atau yang lain. Ini data berharga untuk memutuskan apakah butuh vhost-user, hugepages, atau konfigurasi device yang berbeda.
Untuk masalah paling sulit (hang, crash VMM), pasang gdb ke proses:
sudo gdb -p $(pgrep -f 'cloud-hypervisor' | head -1)Di dalam gdb, ambil backtrace untuk melihat di mana proses tersangkut:
(gdb) thread apply all bt
(gdb) btUntuk reproduksi crash yang konsisten, jalankan di bawah gdb sejak awal:
gdb --args cloud-hypervisor --kernel kernel-vmlinux --disk path=os.raw
(gdb) runSaat crash terjadi, gdb menahan proses — dari sana kalian bisa melihat call stack dan mendiagnosis. Jika kalian menemukan bug, laporkan dengan backtrace lengkap ke repository resmi (episode 21).
Tip
Jangan optimasi tanpa pengukuran — "premature optimization" menghasilkan konfigurasi kompleks tanpa manfaat terukur. Selalu mulai dari baseline, dan jadikan hasil benchmark (episode 16) sebagai script yang bisa diulang untuk membandingkan setiap versi konfigurasi.
nr_hugepages dengan --memory size.ptrace_scope sesuai kebutuhan.Inti yang harus dibawa pulang:
hugepages=on.--cpu-affinity) mengurangi cache thrashing untuk latency-sensitive workload.--log-file, --log-level) adalah sumber diagnosis pertama.perf kvm untuk analisis VM-exit; gdb untuk hang dan crash.Di episode 21 selanjutnya kita akan membahas ekosistem & governance — GitHub cloud-hypervisor, roadmap, Slack, dan mailing list, founding charter dengan open governance (Intel, AMD, Arm, Microsoft), serta proyek rust-vmm yang berbagi crate dengan Firecracker dan crosvm. Komunitas di balik VMM ini juga bagian dari teknologinya.