Lewati ke isi

Server & Infrastruktur

Cara Membatasi CPU dan RAM Container Docker

Cara memberi batas CPU dan RAM container Docker lewat docker run, docker update, dan Docker Compose, plus cara mengecek container yang mati karena OOM.

Terbit 5 menit baca

Jawaban singkat

Batasi RAM dengan --memory dan CPU dengan --cpus saat docker run, ubah container yang sudah berjalan dengan docker update, atau tulis deploy.resources.limits di Docker Compose. Tanpa batas, satu container bisa menghabiskan sumber daya seluruh server.

Daftar isi
  1. Bagaimana cara membatasi RAM container?
  2. Bagaimana cara membatasi CPU container?
  3. Batas lain yang sering terlupa
  4. Mengubah batas container yang sudah berjalan
  5. Menulis batas di Docker Compose
  6. Ringkasan opsi
  7. Bagaimana mengecek apakah batas bekerja?
  8. Berapa angka batas yang wajar?
  9. Pertanyaan yang sering diajukan

Batasi RAM container dengan opsi --memory dan CPU dengan --cpus, misalnya docker run --memory=512m --cpus=1 nginx. Di Docker Compose, batas yang sama ditulis di bagian deploy.resources.limits.

Kenapa ini penting? Secara bawaan, container Docker boleh memakai CPU dan RAM host tanpa batas. Satu aplikasi yang bocor memori atau satu query yang berat bisa membuat seluruh server melambat, lalu kernel mulai membunuh proses secara acak saat RAM habis. Dengan batas yang jelas, masalah di satu container tetap tinggal di container itu.

Bagaimana cara membatasi RAM container?

Opsi utama ada tiga:

  • --memory (atau -m) adalah batas keras. Container yang melewatinya akan dihentikan oleh kernel (OOM kill). Satuan yang bisa dipakai: b, k, m, g. Contoh: --memory=512m.
  • --memory-swap adalah total RAM ditambah swap yang boleh dipakai. Bila nilainya sama dengan --memory, container tidak memakai swap sama sekali. Bila tidak diisi, Docker mengizinkan swap sebesar nilai --memory (total jadi dua kali lipat) bila host punya swap.
  • --memory-reservation adalah batas lunak. Docker berusaha menekan pemakaian container ke angka ini saat host kekurangan memori. Nilainya harus lebih kecil dari --memory.

Contoh yang aman untuk aplikasi web kecil:

docker run -d --name app \
  --memory=512m --memory-swap=512m \
  --memory-reservation=256m \
  myapp:latest

Menyamakan --memory-swap dengan --memory membuat perilaku lebih mudah ditebak: begitu batas tercapai, container berhenti, bukan melambat karena sibuk bertukar ke swap.

Bagaimana cara membatasi CPU container?

  • --cpus membatasi berapa banyak inti CPU yang boleh dipakai. --cpus=1.5 berarti setara satu setengah inti, dibagi ke inti mana pun.
  • --cpuset-cpus mengunci container ke inti tertentu, misalnya --cpuset-cpus="0,1" atau --cpuset-cpus="0-2".
  • --cpu-shares mengatur bobot relatif (bawaan 1024). Bobot ini hanya berpengaruh saat CPU sedang rebutan. Saat CPU senggang, container dengan bobot kecil tetap boleh memakai CPU sebanyak yang tersedia.
docker run -d --name worker --cpus=1 --cpu-shares=512 myworker:latest

Untuk sebagian besar kasus, --cpus sudah cukup. --cpuset-cpus lebih cocok untuk server besar dengan beban khusus, dan --cpu-shares berguna bila kamu ingin satu layanan selalu diprioritaskan saat server sibuk.

Batas lain yang sering terlupa

Selain CPU dan RAM, ada --pids-limit untuk membatasi jumlah proses di dalam container. Ini melindungi host dari aplikasi yang tidak sengaja membuat proses tanpa henti. Contoh: --pids-limit=200.

Mengubah batas container yang sudah berjalan

Tidak perlu membuat ulang container. Gunakan docker update:

docker update --memory=1g --memory-swap=1g --cpus=2 app

Perubahan langsung berlaku. Ingat, docker update hanya mengubah container itu. Bila container dibuat ulang dari Compose atau skrip, batas lama di file konfigurasi akan dipakai lagi, jadi perbarui juga file sumbernya.

Format yang direkomendasikan dokumentasi Compose adalah deploy.resources:

services:
  app:
    image: myapp:latest
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 512M
          pids: 200
        reservations:
          memory: 256M

Jalankan dengan docker compose up -d. Docker Compose versi modern menerapkan limits ini walau tidak memakai Swarm. Atribut lama mem_limit dan cpus di tingkat service masih dikenali, tapi jangan dicampur dengan deploy.resources untuk nilai yang sama agar tidak membingungkan.

Bagian reservations memesan sumber daya minimum. Bila menulis reservations.cpus atau reservations.memory lebih besar dari yang tersedia di host, container bisa gagal dijalankan, jadi isi dengan angka yang realistis.

Ringkasan opsi

Kebutuhandocker run / updateDocker Compose
Batas keras RAM--memory=512mdeploy.resources.limits.memory: 512M
Matikan swap container--memory-swap=512m (sama dengan memory)memswap_limit: 512M
Batas lunak RAM--memory-reservation=256mdeploy.resources.reservations.memory: 256M
Batas inti CPU--cpus=1.5deploy.resources.limits.cpus: "1.5"
Kunci ke inti tertentu--cpuset-cpus="0,1"cpuset: "0,1"
Bobot CPU relatif--cpu-shares=512cpu_shares: 512
Batas jumlah proses--pids-limit=200deploy.resources.limits.pids: 200

Bagaimana mengecek apakah batas bekerja?

Pantau pemakaian langsung:

docker stats

Kolom MEM USAGE / LIMIT menampilkan pemakaian dan batasnya. Bila batas tidak tampil sesuai harapan, cek nilai yang tersimpan:

docker inspect app --format '{{.HostConfig.Memory}} {{.HostConfig.NanoCpus}}'

Nilai Memory dalam byte, sedangkan NanoCpus dalam satuan sepermiliar inti (1 inti = 1000000000).

Container yang tiba-tiba berhenti dengan kode keluar 137 sering kali dibunuh karena melewati batas memori. Pastikan dengan:

docker inspect app --format '{{.State.OOMKilled}} {{.State.ExitCode}}'

Bila hasilnya true 137, naikkan batas memori atau kurangi pemakaian memori aplikasi. Kode 137 juga bisa muncul karena sebab lain (misalnya proses dihentikan paksa), jadi cek kolom OOMKilled terlebih dulu.

Berapa angka batas yang wajar?

Tidak ada angka universal. Cara paling jujur adalah mengamati dulu. Jalankan aplikasi tanpa batas ketat selama beberapa hari dengan beban normal, catat puncak pemakaian di docker stats atau alat monitoring, lalu beri batas sekitar puncak itu ditambah ruang cadangan. Total batas semua container sebaiknya tidak melebihi RAM host dikurangi kebutuhan sistem operasi.

Kalau batas yang wajar ternyata sudah melewati kapasitas server, itu tanda server perlu ditambah. Panduan memilih spesifikasi VPS membantu menghitung ulang kebutuhannya. Untuk kesalahan lain yang sering terjadi saat menjalankan container, baca kesalahan umum Docker di produksi, dan bila Docker belum terpasang, mulai dari cara install Docker dan Docker Compose di Ubuntu.

Pertanyaan yang sering diajukan

Apakah container tanpa batas bisa membuat server crash?

Bisa membuat server sangat lambat atau tidak responsif. Saat RAM host habis, kernel akan membunuh proses untuk membebaskan memori, dan proses yang dibunuh belum tentu proses yang bermasalah.

Kenapa muncul peringatan kernel tidak mendukung swap limit?

Peringatan itu muncul di host yang belum mengaktifkan akuntansi memori swap di cgroup. Distro modern dengan cgroup v2 umumnya sudah mendukung. Bila masih muncul, batas memori tetap berlaku, hanya batas swap yang diabaikan.

Apakah --cpus=0.5 membuat aplikasi lebih lambat?

Ya, bila aplikasi butuh lebih dari setengah inti. Container akan dibatasi (throttled) begitu jatahnya habis dalam setiap periode penjadwalan, sehingga waktu respons bisa naik saat beban tinggi.

Sumber & referensi

Baca juga