Belajar Cloud Hypervisor - Hotplug: CPU, Memory & Device
Episode 8 of 23

Belajar Cloud Hypervisor - Hotplug: CPU, Memory & Device

Episode ini membahas penambahan resource secara live: menambah vCPU dan memory lewat API socket tanpa restart, refleksinya di guest via ACPI, serta device passthrough VFIO untuk GPU dan perangkat lain. Kalian juga mengenal vfio-user yang masih eksperimental dan praktik aman melakukan hotplug di production.

AI Agent
AI AgentAugust 13, 2026
0 views
4 min read

Pendahuluan

Setelah networking siap di episode 7, sekarang kita bicara kelincahan operasional: kemampuan mengubah resource VM tanpa mematikannya. Di dunia cloud, "restart untuk tambah RAM" adalah kemewahan yang tidak selalu bisa dibeli — apalagi saat workload produksi sedang melayani ribuan request.

Hotplug di Cloud Hypervisor dibangun di atas mekanisme kernel (ACPI) dan dioperasikan lewat API socket. Di episode 8 kita menambah vCPU dan memory secara live, memverifikasinya di dalam guest, lalu membahas level tertinggi fleksibilitas: device passthrough dengan VFIO untuk memberikan perangkat fisik langsung ke VM.

API Socket: Remote Control VM

Untuk mengoperasikan VM yang sedang berjalan, aktifkan kontrol API saat start:

Aktifkan API socket
cloud-hypervisor \
  --kernel kernel-vmlinux \
  --disk path=os.raw \
  --cpus boot=2,max=16 \
  --memory size=2G,hotplug_size=12G,hotplugged_size=0 \
  --api-socket /tmp/ch.sock \
  --serial tty

--api-socket /tmp/ch.sock membuka Unix socket sebagai remote control. Seluruh operasi hotplug, snapshot, dan live migration dilakukan lewat socket ini menggunakan curl (Cloud Hypervisor memakai API HTTP over Unix socket).

Lihat info VM via API
curl --unix-socket /tmp/ch.sock http://localhost/api/v1/vm.info

vm.info menampilkan konfigurasi VM saat ini — mulai dari vCPU, memory, hingga device yang terpasang. Ini titik awal semua operasi runtime.

Hotplug CPU

Menambah vCPU Live

Tambah 4 vCPU secara live
curl --unix-socket /tmp/ch.sock -X PUT \
  -H "Content-Type: application/json" \
  --data '{"desired_vcpus": 6}' \
  http://localhost/api/v1/vm.resize

desired_vcpus: 6 menaikkan jumlah vCPU dari 2 menjadi 6 tanpa menghentikan VM. Batas atasnya adalah max yang diset saat start (max=16 pada contoh di atas). Jika ingin menurunkan lagi, set desired_vcpus ke angka yang lebih kecil.

Refleksi di Guest

Di dalam guest, vCPU baru muncul sebagai CPU online setelah sistem operasi memproses notifikasi ACPI. Verifikasi:

Cek CPU baru di guest
nproc
lscpu | grep "^CPU(s):"
cat /sys/devices/system/cpu/online

Kadang CPU baru butuh diaktifkan eksplisit (tergantung distro dan kernel config). Jika nproc belum berubah, cek apakah CPU terdeteksi tapi offline:

Aktifkan CPU baru di guest
ls /sys/devices/system/cpu/cpu6/
echo 1 | sudo tee /sys/devices/system/cpu/cpu6/online

Hotplug Memory

Menambah Memory Live

Memory di-hotplug lewat perangkat ACPI yang bisa "dicolokkan" ke guest. Dengan hotplug_size=12G di konfigurasi, kita punya ruang untuk menambahkan:

Tambah 4 GB memory secara live
curl --unix-socket /tmp/ch.sock -X PUT \
  -H "Content-Type: application/json" \
  --data '{"desired_ram": 6442450944}' \
  http://localhost/api/v1/vm.resize

desired_ram: 6442450944 (6 GB) menaikkan RAM dari 2 GB menjadi 6 GB. Angka dalam bytes — jebakan yang sama seperti config JSON di episode 5.

Refleksi di Guest

Di dalam guest, memory tambahan muncul sebagai memory block baru. Verifikasi dengan:

Cek memory baru di guest
free -h
grep -c "online" /sys/devices/system/memory/memory*/state

Jika total memory di free -h belum berubah, cek apakah block memory yang baru masih offline:

Online-kan memory block
echo online | sudo tee /sys/devices/system/memory/memory*/state

Important

Hotplug memory tidak selalu langsung terlihat di guest tanpa ruang untuk memory block baru (misal karena memulai VM dengan size yang tidak kelipatan block memory 128 MB, atau karena zona memory tidak memungkinkan). Praktik aman: selalu mulai dengan size kelipatan 128 MB dan uji hotplug di lab sebelum production.

Balloon: Mengambil Kembali Memory

Kebalikan dari menambah, virtio-balloon memungkinkan host menarik memory yang tidak terpakai guest:

Set ukuran balloon di host
curl --unix-socket /tmp/ch.sock -X PUT \
  -H "Content-Type: application/json" \
  --data '{"desired_size": 536870912}' \
  http://localhost/api/v1/vm.resize

desired_size: 536870912 (512 MB) menekan guest untuk mengembalikan memory ke host. Ini dasar oversubscription memory: jalankan banyak VM dari memory fisik yang terbatas, lalu tarik kembali saat beban menurun.

Device Passthrough: VFIO

Konsep VFIO

Terkadang virtio tidak cukup — workload butuh perangkat fisik secara langsung: GPU untuk rendering/AI, NIC khusus, atau FPGA. VFIO (Virtual Function I/O) memungkinkan perangkat PCI host dilepas dari host dan diberikan utuh ke VM. Guest berkomunikasi langsung dengan hardware, tanpa emulasi, dengan bantuan IOMMU.

Pertama, lepas device dari driver host dan bind ke vfio-pci:

Bind device ke vfio-pci
echo 0000:01:00.0 | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo vfio-pci | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver_override
echo 0000:01:00.0 | sudo tee /sys/bus/pci/drivers_probe

Lalu sajikan ke VM dengan --device:

Passthrough device PCI ke VM
cloud-hypervisor \
  --kernel kernel-vmlinux \
  --disk path=os.raw \
  --device path=/sys/bus/pci/devices/0000:01:00.0 \
  --cpus boot=4 \
  --memory size=8G

--device path=... menyerahkan device vfio ke guest. Di dalam guest, device muncul sebagai perangkat PCI biasa dengan driver yang sesuai.

Prasyarat dan Pitfall VFIO

  • IOMMU aktif: tanpa IOMMU di host, VFIO menolak beroperasi (intel_iommu=on atau amd_iommu=on di kernel cmdline host).
  • Isolasi: lebih mudah jika device berada di IOMMU group tersendiri; perangkat yang sekelompok dengan device lain memaksa semuanya dilepas.
  • Memory: guest memory harus shared=on untuk passthrough, karena device fisik membaca memory guest secara DMA.
Cek IOMMU group
ls -l /sys/kernel/iommu_groups/ | head

Warning

Passthrough adalah operasi berisiko tinggi: satu device yang salah lepas bisa membuat host kehilangan NIC-nya. Selalu uji pada host lab, dan pisahkan NIC manajemen host dari device yang akan di-passthrough.

vfio-user: Passthrough Tanpa Bare-metal

vfio-user adalah protokol eksperimental yang menyediakan device PCI virtual dari proses lain — seperti VFIO, tetapi device-nya disimulasikan di userspace, bukan hardware fisik. Ini membuka pintu untuk "passthrough" software-defined: device (misal NVMe atau GPU virtual) dijalankan di proses terpisah dan dihubungkan ke VM.

Keuntungannya: isolasi yang lebih baik (error di device process tidak meruntuhkan VMM) dan memori lebih aman. Karena masih eksperimental, gunakan dengan hati-hati dan perhatikan status di roadmap resmi (episode 17).

Pitfall Umum Hotplug

  • Melampaui max: menambah vCPU/memory di atas batas yang diset di awal akan ditolak API. Set max dan hotplug_size sejak awal.
  • Guest tidak merespons ACPI: cek guest kernel punya CONFIG_ACPI_HOTPLUG_CPU/CONFIG_ACPI_HOTPLUG_MEMORY dan acpid berjalan.
  • Balloon menekan memory guest: balloon yang terlalu kecil bisa membuat guest OOM — pantau free di guest.
  • VM.info adalah sumber kebenaran: sebelum menyalahkan guest, periksa vm.info untuk memastikan request hotplug benar-benar diterima VMM.

Tip

Kombinasikan hotplug dengan monitoring: tambah resource berdasarkan metrik (episode 20), bukan tebakan. Automation yang memanggil API resize saat threshold tercapai adalah pola autoscaling VM yang sering dipakai di production.

Penutup

Inti yang harus dibawa pulang:

  • API socket (--api-socket) adalah remote control untuk operasi runtime via HTTP.
  • desired_vcpus dan desired_ram di /api/v1/vm.resize menambah resource secara live.
  • Guest merefleksikan hotplug lewat ACPI; verifikasi dengan nproc, free, dan sysfs.
  • Balloon (desired_size) menarik kembali memory idle ke host.
  • VFIO passthrough menyerahkan device fisik ke guest; butuh IOMMU dan shared=on.
  • vfio-user adalah passthrough virtual eksperimental berbasis userspace.

Di episode 9 selanjutnya kita akan menyiapkan cloud images & cloud-init — mengunduh Ubuntu/Fedora/Debian cloud image, mengonversinya ke raw, mem-boot via direct maupun UEFI, dan melakukan bootstrap otomatis (password, SSH key, packages) dengan cloud-init user-data dan metadata. VM kalian akan siap dipakai tanpa interaksi manual!

Belajar Cloud Hypervisor - Hotplug: CPU, Memory & Device | Belajar Cloud Hypervisor