Episode ini membahas pengendalian sumber daya microVM: device balloon untuk menarik kembali memori dari guest, statistik balloon dan MMIO, virtio-rng untuk entropy guest, cap rate per device, serta cgroup v2 untuk membatasi CPU dan memori di level host.

Di episode 9 kita bisa membekukan dan menghidupkan microVM. Sekarang tantangan yang lebih halus: bagaimana ratusan microVM berbagi satu host secara adil? Episode 10 membahas pengendalian sumber daya — memori lewat device balloon, entropy lewat virtio-rng, dan batas keras CPU/memori lewat cgroup v2.
Mengapa episode ini penting? Tanpa kontrol sumber daya, satu microVM bisa menyedot semua memori atau memonopoli CPU, menjatuhkan tetangganya. Dengan balloon dan cgroup, operator bisa menentukan dengan presisi berapa banyak sumber daya yang boleh dipakai tiap VM — dasar dari ekonomi multi-tenant yang membuat Firecracker layak dipakai di skala AWS.
Device virtio-balloon adalah mekanisme Firecracker untuk menarik kembali memori dari guest ke host. Konsepnya: host "mengembang" balloon di dalam guest, mendorong guest untuk melepaskan halaman memori yang tidak terpakai; halaman itu kembali ke pool host dan bisa dipakai VM lain.
Konfigurasikan balloon sebelum boot:
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT http://localhost/balloon \
-H 'Accept: application/json' -H 'Content-Type: application/json' \
-d '{
"amount_mib": 128,
"deflate_on_oom": true,
"stats_polling_interval_s": 10
}'Field penting:
amount_mib — berapa MiB memori yang ditarik dari guest (balloon di-inflate sebesar ini).deflate_on_oom — saat guest kekurangan memori (OOM), balloon otomatis mengempis memberi memori balik — pengaman yang mencegah guest di-kill.stats_polling_interval_s — interval pengumpulan statistik memori guest.Ukuran balloon bisa diubah dinamis setelah boot via PATCH /balloon — mengembang saat VM idle, mengempis saat VM butuh:
curl --unix-socket /tmp/firecracker.sock -i \
-X PATCH http://localhost/balloon \
-H 'Accept: application/json' -H 'Content-Type: application/json' \
-d '{ "amount_mib": 512 }'Warning
Balloon bekerja dengan kerja sama guest: driver balloon di dalam guest (bawaan kernel Linux) menentukan halaman mana yang dilepas. Guest tanpa driver atau guest yang menolak melepas memori tidak akan efektif — dan deflate_on_oom adalah satu-satunya pengaman bila balloon terlalu agresif. Jangan pernah "mengembang" balloon hingga melampaui memori yang benar-benar dibutuhkan guest.
Statistik balloon memberi jendela ke kondisi memori guest dari sisi host. Dengan stats_polling_interval_s aktif, host bisa membaca:
curl --unix-socket /tmp/firecracker.sock http://localhost/balloon/statisticsOutputnya berbentuk JSON berisi metrik seperti free_memory, available_memory, pages_reclaimed — data yang bisa dipakai orchestrator untuk memutuskan kapan mengembang/mengempis balloon secara otomatis. Ini pola control loop yang sama dengan memory reclamation di hypervisor modern: monitor → decide → adjust.
Device balloon di Firecracker dipetakan via MMIO, sama seperti device virtio lain. Artinya, ia berpartisipasi dalam aturan yang sama: hanya bisa dikonfigurasi sebelum boot, dan berjalan sebagai device virtio standar yang dikenali kernel guest.
MicroVM yang baru lahir sering kekurangan entropy — sumber keacakan untuk kriptografi (TLS, UUID, kunci). Host punya getrandom dan hardware RNG; guest di dalam VM tidak otomatis mendapat akses ke sana. Tanpa entropy, proses kriptografi di guest bisa terblokir menunggu keacakan.
Solusinya adalah device virtio-rng, yang diaktifkan secara default di konfigurasi Firecracker dan menyuntikkan entropy dari host ke guest. Konfigurasinya bisa disesuaikan melalui machine config:
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT http://localhost/machine-config \
-H 'Accept: application/json' -H 'Content-Type: application/json' \
-d '{
"vcpu_count": 2,
"mem_size_mib": 1024,
"entropy": { "rate_limiter": { "ops": { "size": 1000, "refill_time": 100 } } }
}'Cek entropy di dalam guest:
cat /proc/sys/kernel/random/entropy_availJika angkanya tinggi dan tidak pernah macet, virtio-rng bekerja. Perhatikan juga bahwa rate limiter bisa diterapkan ke device entropy — mencegah satu VM menguras sumber entropy host lewat permintaan berlebihan.
Balloon bersifat persuasif (minta guest melepas memori). Batas cgroup bersifat memaksa — di level kernel, tanpa kerja sama guest. Dengan cgroup v2, tiap microVM ditempatkan di cgroup sendiri:
mkdir -p /sys/fs/cgroup/fc/<id>
echo 1024 > /sys/fs/cgroup/fc/<id>/memory.max
echo 500000 > /sys/fs/cgroup/fc/<id>/cpu.maxMembaca nilai ini:
memory.max — memori maksimal (byte) untuk grup. Jika dilewati, kernel melakukan reclaim; jika tidak bisa, OOM-kill di dalam grup.cpu.max — dalam format quota period (misal 500000 100000 = 500 ms per 100 ms period = 5 vCPU).cpuset.cpus — pilih CPU mana yang boleh dipakai, membantu isolasi dan NUMA.Lalu tempatkan proses Firecracker ke dalam cgroup:
echo <firecracker-pid> > /sys/fs/cgroup/fc/<id>/cgroup.procsJailer sudah membuat cgroup dasar untuk tiap VM; dengan cgroup v2, operator memperluasnya dengan batas eksplisit. Kombinasi balloon + cgroup adalah pola lengkap:
Keduanya bekerja di lapisan berbeda dan saling melengkapi.
Selain cgroup, tiap device I/O punya batas sendiri lewat rate limiter (dibahas di episode 5). Peta lengkap pengendalian sumber daya:
cpu.max + pilihan vCPU di machine config.memory.max + balloon amount_mib.bandwidth + ops di network interface.bandwidth + ops di drive.Dengan peta ini, operator bisa memberikan janji layanan yang terukur per VM — dan menegakkannya di beberapa lapisan sekaligus.
Tip
Mulailah dengan angka yang longgar: batas cgroup di atas perkiraan pemakaian puncak, balloon hanya untuk memori yang benar-benar idle. Terlalu ketat sejak awal menyebabkan OOM-kill dan degradasi yang sulit di-debug. Ketatkan seiring data.
deflate_on_oom false: risiko guest di-kill saat pressure memori; aktifkan kecuali ada alasan kuat.memory.max > mem_size_mib + overhead.stats_polling_interval_s harus diset agar data statistik dikumpulkan.Inti yang harus dibawa pulang:
deflate_on_oom mencegah OOM di guest saat balloon terlalu agresif.entropy_avail.cpu.max) dan memori (memory.max).Di episode 11 selanjutnya kita akan menjembatani Firecracker dengan dunia container: Integrasi Container — firecracker-containerd — runtime containerd yang menjalankan tiap container di dalam microVM Firecracker, memahami komponen runtime dan snapshotter overlay, serta alur pull image, unpack, dan menjalankan container dalam microVM dengan bridge network.