Topik ini membahas pembatasan memori dan CPU yang boleh dipakai sebuah container. Pembahasan mencakup perilaku default tanpa batas, opsi --memory dan --memory-swap, opsi --cpus dan --cpu-shares, akibat yang muncul saat memori habis, serta pemantauan pemakaian dengan docker stats. Setelah membacanya, satu container tidak lagi mampu melahap seluruh sumber daya host secara tidak sengaja. Host sendiri berarti mesin tempat Docker berjalan.
Perilaku default tanpa batas#
Container bukan mesin terpisah, melainkan sekumpulan proses yang berjalan di atas kernel host dan berbagi CPU serta memori dengan proses lain. Secara default Docker tidak memasang batas apa pun, sehingga satu container yang perilakunya menyimpang dapat menghabiskan seluruh memori atau memonopoli seluruh inti CPU. Pada host bersama yang menjalankan beberapa container sekaligus, satu container liar membuat container lain kekurangan sumber daya tanpa alasan yang terlihat.
Mekanisme pembatasnya berada di kernel, yaitu kelompok kontrol atau cgroup yang mengatur pemakaian sumber daya sekumpulan proses. Opsi pembatas pada docker run diterjemahkan Docker menjadi pengaturan cgroup, sehingga batasnya ditegakkan kernel secara otomatis dan tidak bergantung pada kerja sama aplikasi. Aplikasi di dalam container tidak perlu mengetahui adanya batas tersebut.
Membatasi memori#
Opsi --memory menetapkan jumlah memori maksimum yang boleh dipakai container, dengan satuan b, k, m, atau g untuk byte, kilobyte, megabyte, dan gigabyte. Nilai yang umum dipilih untuk aplikasi kecil adalah --memory=512m. Pengaturan pendampingnya adalah --memory-swap yang menetapkan total memori ditambah ruang swap, yaitu wilayah di disk yang dipakai kernel sebagai perpanjangan memori.
Perilaku --memory-swap mengikuti tiga aturan berikut.
- Apabila hanya
--memoryyang diberikan, totalnya menjadi dua kali batas memori, sehingga setengah sisanya berupa swap. - Apabila
--memory-swapdisamakan dengan--memory, swap dinonaktifkan dan container hanya memakai memori asli. - Apabila
--memory-swapdiberi nilai-1, jumlah swap yang boleh dipakai tidak dibatasi.
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# batas memori 512m dengan swap mengikuti nilai bawaan
docker run -d --memory=512m --name catatan-app catatan
# batas memori 512m tanpa swap
docker run -d --memory=512m --memory-swap=512m --name catatan-uji catatanContainer yang menyentuh batas memori tidak langsung dihentikan, karena kernel masih dapat menumpahkan sebagian datanya ke swap sesuai aturan di atas. Swap yang dipakai membuat akses jauh lebih lambat daripada memori asli, sehingga gejalanya biasanya berupa aplikasi yang melambat drastis sebelum sumber daya benar-benar habis. Karena itu, batas memori perlu diberi ruang sisa dan tidak disetel persis pada pemakaian normal aplikasi.
Membatasi CPU#
Opsi --cpus menetapkan batas keras pemakaian CPU dengan nilai desimal, misalnya --cpus=1.5 berarti container tidak akan memakai lebih dari satu setengah inti berapa pun jumlah inti pada host. Batas ini ditegakkan terus-menerus, sehingga container yang mencoba bekerja lebih keras hanya diperlambat. Opsi kedua, --cpu-shares, mengatur porsi secara relatif dengan nilai bawaan 1024 dan hanya berperan saat CPU diperebutkan antar proses.
| Opsi | Sifat | Arti |
|---|---|---|
--cpus=1.5 | Batas keras | Pemakaian CPU dipagari pada satu setengah inti dalam segala kondisi |
--cpu-shares=512 | Bobot relatif | Porsi dibagi dua kali lebih tipis dibanding nilai bawaan, hanya berlaku saat CPU langka |
Keduanya menjawab kebutuhan yang berbeda. Batas keras cocok untuk menjaga kapasitas tersisa bagi proses lain, sedangkan bobot relatif cocok untuk menetapkan prioritas tanpa mencadangkan kapasitas yang tidak terpakai. Container yang sedang sendirian di host tetap boleh menggunakan seluruh inti yang tersedia apabila hanya diberi bobot relatif.
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# batas keras satu setengah inti CPU
docker run -d --cpus=1.5 --name catatan-app catatanPerilaku saat memori habis#
Ketika container melampaui batas memori dan tidak tersisa swap, kernel menghentikan proses pelanggar melalui mekanisme OOM, singkatan dari out of memory, yaitu kondisi kehabisan memori. Container pun berhenti dengan kode keluar 137. Angka tersebut bukan angka pilihan aplikasi, melainkan 128 ditambah nomor sinyal SIGKILL yang dikirim kernel, sehingga kode 137 pada docker ps -a hampir selalu menunjuk ke masalah memori.
Keadaan penyebabnya dapat dipastikan pada docker inspect, yang menandai container yang dihentikan karena OOM dengan penanda khusus pada bagian state. Kode keluar 137 sering disalahartikan sebagai bug aplikasi karena kelihatannya seperti crash, yaitu penghentian mendadak yang tidak disengaja. Memeriksa penanda OOM terlebih dahulu menghemat waktu diagnosis, karena penyebabnya ada pada batas sumber daya, bukan pada logika program.
Memantau dengan docker stats#
Pemilihan batas yang tepat bertumpu pada data pemakaian, dan perintah docker stats menyediakannya secara langsung. Perintah ini menampilkan satu baris untuk setiap container yang berjalan, berisi persentase CPU yang sedang dipakai, jumlah memori yang terpakai dibandingkan batasnya, serta lalu lintas jaringan dan disk. Nilai pembanding pada kolom memori otomatis mengikuti --memory, sehingga efek pembatasan terlihat tanpa alat tambahan.
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
docker statsKeluarannya diperbarui berkala sampai perintah dihentikan, sehingga cocok untuk mengamati perilaku aplikasi saat melayani beban. Pola pemakaiannya yang lazim adalah mengukur puncak pemakaian pada beban normal, lalu menetapkan batas dengan ruang sisa yang cukup. Pemantauan yang lebih mendalam, termasuk membaca kebocoran memori secara bertahap, memakai perangkat yang sama.
Ringkasan#
- Container memakai sumber daya host tanpa batas secara default, dan pembatasannya ditegakkan kernel melalui cgroup.
--memorymenetapkan batas memori, sedangkan--memory-swapmengatur total memori ditambah swap dengan nilai bawaan dua kali batas memori.--cpusmemasang batas keras pemakaian CPU, sedangkan--cpu-shareshanya mengatur porsi relatif saat CPU diperebutkan.- Container yang melampaui batas memori dihentikan kernel dengan kode keluar 137 dan ditandai OOM pada
docker inspect.
Referensi#
- Resource constraints — Docker Docs — Dokumentasi resmi pembatasan memori, CPU, dan konsekuensinya.
- docker container run — Docker Docs
— Rujukan opsi
--memory,--memory-swap, dan--cpus.