Cara Batasi Memory Cgroups di Systemd Linux

Membatasi penggunaan memori pada sistem Linux modern dilakukan melalui integrasi Systemd dengan Control Groups (cgroups) v1 atau v2. Dengan mendefinisikan parameter direktori service Systemd, administrator dapat mencegah sebuah aplikasi mengalami kebocoran memori (memory leak) yang berujung pada kelumpuhan sistem atau terpicunya mekanisme Out-Of-Memory (OOM) Killer pada proses krusial lainnya.

Pengaturan batas memori ini diterapkan secara langsung melalui berkas konfigurasi unit service Systemd tanpa perlu memodifikasi kode sumber aplikasi. Parameter utama yang digunakan adalah MemoryMax, MemoryHigh, dan MemoryLimit yang masing-masing memiliki ambang batas perilaku berbeda terhadap manajemen alokasi RAM kernel Linux.

Parameter Utama Memory Cgroups pada Systemd

Systemd menyediakan beberapa direktif pengelolaan memori yang dapat disematkan di dalam blok [Service] pada berkas unit (misalnya /etc/systemd/system/nama-service.service). Pemahaman fungsi tiap parameter mencegah kesalahan konfigurasi yang menyebabkan aplikasi terhenti mendadak.

Parameter Systemd Setara cgroups v1 Fungsi & Perilaku Utama
MemoryMax memory.max Batas absolut penggunaan memori. Jika terlampaui, kernel memicu OOM pada proses di cgroup tersebut.
MemoryHigh memory.high Ambang batas kuota lunak (soft limit). Jika terlewati, proses akan diperlambat (throttled) dan dipaksa melakukan reclaim memori.
MemoryLow memory.low Proteksi memori minimal. Kernel akan berusaha menjaga agar cgroup ini tidak ditekan di bawah batas tersebut.
MemoryLimit memory.limit_in_bytes Parameter warisan (deprecated) cgroups v1 untuk menetapkan batas maksimum memori. Disarankan beralih ke MemoryMax.

Langkah Konfigurasi Memory Limit pada Systemd Service

Penerapan batas memori pada sebuah service kustom memerlukan modifikasi direktori unit service. Berikut adalah prosedur teknis langkah demi langkah:

  1. Buka atau buat berkas override untuk service target menggunakan perintah editor terminal:
    sudo systemctl edit nama-service
  2. Tambahkan blok konfigurasi [Service] beserta batasan memori yang diinginkan pada editor yang terbuka. Contoh di bawah membatasi service maksimal menggunakan RAM sebesar 500 Megabita:
    [Service]
    MemoryMax=500M
    MemoryHigh=400M
  3. Simpan berkas dan keluar dari editor teks.
  4. Muat ulang (reload) daemon Systemd agar membaca konfigurasi terbaru:
    sudo systemctl daemon-reload
  5. Restart service terkait untuk menerapkan perubahan cgroups:
    sudo systemctl restart nama-service

Verifikasi Penggunaan Cgroups Memory

Setelah service berjalan dengan aturan pembatasan baru, administrator wajib memverifikasi apakah cgroups telah aktif mengontrol alokasi memori proses tersebut. Perintah utama untuk melakukan pengecekan real-time adalah menggunakan utilitas systemd-cgtop atau memeriksa status service secara spesifik.

Jalankan perintah berikut di terminal untuk memantau penggunaan sumber daya secara menyeluruh:

systemd-cgtop

Atau untuk memeriksa detail alokasi memori pada satu unit service tertentu, gunakan:

systemctl status nama-service

Perintah tersebut akan menampilkan baris informasi Memory: [jumlah_memori] yang menunjukkan konsumsi RAM aktual di bawah kontrol cgroups Systemd.

Troubleshooting Kendala OOM Killer

Jika aplikasi sering berhenti secara tiba-tiba dengan status keluar (exit code) 137 atau pesan Out of Memory di dalam log sistem (journalctl -u nama-service), artinya proses telah melampaui batas absolut MemoryMax.

Langkah penanganan di lapangan mencakup:

  • Tinjau ulang nilai MemoryMax dan tingkatkan alokasinya jika aplikasi memang membutuhkan footprint RAM lebih besar saat lonjakan trafik.
  • Manfaatkan parameter MemoryHigh dengan nilai lebih rendah dari MemoryMax agar kernel dapat melakukan pembatasan kecepatan alokasi (throttling) terlebih dahulu alih-alih langsung mematikan proses.
  • Periksa potensi kebocoran memori pada aplikasi dengan profiling kode atau utilitas monitoring eksternal.