Belajar LXC - Resource Limits dengan cgroups
Episode 7 of 23

Belajar LXC - Resource Limits dengan cgroups

Episode ini mengajarkan pembatasan resource container lewat cgroup2: lxc.cgroup2.memory.max untuk memory dan lxc.cgroup2.cpu.max untuk CPU, serta verifikasi dengan lxc-cgroup (legacy) dan systemd-cgls di host.

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

Pendahuluan

Di episode 6 container kalian sudah punya jaringan. Tapi apa yang mencegah satu container mengonsumsi seluruh 32 GB RAM host? Jawabannya: cgroups. Di episode 7 kita memasang batas resource lewat cgroup2 — konsep yang sudah kita perkenalkan di episode 2 — lalu memverifikasinya dengan alat bawaan LXC dan sistem host. Tanpa limit, satu aplikasi bocor memory bisa membawa turun seluruh host.

Mengapa Resource Limit Penting

Cgroups adalah meteran listrik per unit di gedung kita: namespaces membatasi "apa yang terlihat", cgroups membatasi "apa yang boleh dipakai". Tanpa cgroups, perilaku buruk satu container (loop CPU penuh, memory leak) akan mengganggu semua tenant lain. Dengan limit yang tepat:

  • Satu container tidak bisa menurunkan host atau container lain.
  • Kapasitas host bisa direncanakan dan dihitung (episode 18).
  • QoS antar workload menjadi bisa diprediksi.

Konfigurasi Limit di Container Config

LXC modern memakai cgroup2, dan limit ditulis langsung di config container dengan awalan lxc.cgroup2.. File config container berada di /var/lib/lxc/<nama>/config. Ini contoh lengkap untuk container c1:

Linux/var/lib/lxc/c1/config (limit)
# Limitasi memory: maksimal 512MB
lxc.cgroup2.memory.max = 512M
 
# Limitasi CPU: 200000/100000 = 2 core penuh
lxc.cgroup2.cpu.max = 200000 100000
 
# Beri tahu kernel agar swappiness rendah untuk container
lxc.cgroup2.memory.swap.max = 0
 
# Prioritas I/O (0-10000), semakin kecil semakin diprioritaskan
lxc.cgroup2.io.weight = 100

Mari bedah tiap baris:

  • lxc.cgroup2.memory.max = 512M — batas memory utama. Jika container menembus batas ini, kernel akan menekan (pressure) atau meng-OOM-kill proses di dalamnya. Unit bisa K, M, G, atau angka byte mentah.
  • lxc.cgroup2.cpu.max = 200000 100000 — formatnya <quota> <period> dalam microsecond. 200000/100000 berarti 2 core; 50000/100000 berarti setengah core.
  • lxc.cgroup2.memory.swap.max = 0 — mematikan swap untuk container, membuat memory limit lebih tegas.
  • lxc.cgroup2.io.weight = 100 — skala 1-10000; memengaruhi seberapa besar jatah bandwidth I/O blok relatif terhadap container lain.

Tip

Nama kunci cgroup2 berbeda dari cgroup v1. Di v1 kalian menulis lxc.cgroup.memory.limit_in_bytes; di v2 menjadi lxc.cgroup2.memory.max. Pada LXC 7.0 dengan kernel modern, gunakan varian cgroup2 — lebih bersih dan didukung penuh oleh systemd.

Menerapkan dan Verifikasi

Terapkan Limit

Setelah mengedit config, restart container agar limit berlaku:

Restart container untuk terapkan limit
lxc-stop -n c1
lxc-start -n c1

Verifikasi via lxc-cgroup (Legacy)

Alat lxc-cgroup memungkinkan melihat dan mengubah nilai cgroup container secara langsung. Baca nilai saat ini:

Baca limit memory dan CPU
lxc-cgroup -n c1 memory.max
lxc-cgroup -n c1 cpu.max

Warning

lxc-cgroup dianggap legacy dan hanya mengenal nama kunci cgroup v1. Pada LXC 7.0, ia tetap ada untuk kompatibilitas, tetapi verifikasi utama di bawah ini (systemd-cgls) lebih akurat dan menjadi standar pada cgroup2.

Verifikasi via systemd-cgls di Host

Cara paling tepercaya adalah melihat hierarki cgroup langsung dari host. Temukan container dalam tree systemd:

Lihat cgroup container di hierarki host
systemd-cgls /lxc/c1

Kalian juga bisa membaca file cgroup secara langsung:

Baca file cgroup container
cat /sys/fs/cgroup/lxc/c1/memory.max
cat /sys/fs/cgroup/lxc/c1/cpu.max

Jika angka yang terbaca sama dengan yang dikonfigurasi, limit sudah berlaku.

Uji Nyata: Buktikan Limit Bekerja

Bukti terbaik adalah eksperimen. Masuk ke container dan coba alokasikan memory lebih dari limit:

Tekan memory container
lxc-attach -n c1 -- dd if=/dev/zero of=/dev/null bs=1M count=10000

Dengan limit 512M, proses ini akan di-OOM-kill atau ditekan — sementara host tetap sehat. Di sisi CPU:

Bakar CPU di dalam container
lxc-attach -n c1 -- sh -c 'while :; do :; done &'

Pantau penggunaan CPU dari host dengan top dan systemd-cgtop:

Monitor penggunaan cgroup
systemd-cgtop

CPU container akan terkunci di jatahnya (misal 200%), tidak lebih.

Warning

Ingat untuk mematikan proses test di atas (lxc-stop -n c1 atau kill dari dalam container). Proses bakar CPU yang dibiarkan jalan akan menghabiskan jatah CPU container secara permanen dan bisa memperlambat semua workload lain di container yang sama.

Perencanaan Limit

Aturan praktis perencanaan:

  • Memory: beri sedikit lebih dari kebutuhan puncak workload (misal aplikasi butuh 400M → limit 512M), tetapi jangan lebih dari total RAM host dibagi jumlah container.
  • CPU: kuota harus menjumlahkan ≤ total core host jika semua container aktif bersamaan, atau gunakan cpu.max longgar jika beban bersifat bursty dan saling melengkapi.
  • Selalu verifikasi setelah menerapkan — limit yang salah ketik (misal 500M vs 500m) bisa menghasilkan angka tak terduga.

Penutup

Inti yang harus dibawa pulang:

  • cgroups (cgroup2) adalah pengatur jatah resource: memory, CPU, dan I/O.
  • lxc.cgroup2.memory.max dan lxc.cgroup2.cpu.max adalah kunci utama di config container.
  • lxc-cgroup adalah alat legacy; systemd-cgls, systemd-cgtop, dan file di /sys/fs/cgroup adalah verifikasi modern.
  • Uji limit dengan eksperimen nyata: dd untuk memory, loop untuk CPU.
  • Rencanakan limit agar total permintaan tidak melebihi kapasitas host.

Di episode 8 selanjutnya kita akan membahas storage: rootfs, images & snapshots — backend dir, btrfs, zfs, LVM, dan loop beserta lxc-create --bdev/--fstype, serta peran template download, lxc-copy, dan lxc-snapshot dalam pengelolaan image.