Tutorial Docker - Resource Limits dan Stats

    Pada materi kali ini, kita akan melanjutkan seri dari Tutorial Docker. Setelah sebelumnya kita membahas tentang Docker Network kita akan masuk ke materi selanjutnya yaitu Docker Resource Limits dan Stats.


Apa Itu Resource Limits?

    Resource Limits adalah mekanisme pembatasan sumber daya dalam container untuk membatasi CPU dan Memory. Dengan adanya resource limits kita bisa mengalokasikan sumber daya, menjaga stabilitas dan kinerja sistem secara keseluruhan.

Perintah CLI Pada Resource Limits

  1. --memory (-m)
    Memberikan batasan maksimum memori yang dapat digunakan oleh container. Jika container melebihi batasan ini, maka proses akan dibatasi atau dihentikan.
  2. --memory-reservation
    Memberikan kuota minimal untuk digunakan oleh container.

    Misalnya temen-temen memberikan batasan penggunaan memori (-m) 500 MB, dan reservasi memori sekitar 300 MB. 
    Jika aplikasi temen-temen menggunakan memori sekitar 300 MB maka itu tidak akan terjadi masalah, jika penggunaan memori naik jadi 400 MB maka container akan ambil memori ke host. Namun, jika penggunaan memori naik lagi ke 600 MB maka container akan dihentikan karena melebih batasan yang telah di berikan.
  3. --memory-swap
    Memory Swap adalah kombinasi batasan antara memori fisik (RAM) dan memori virtual (Swap). Jika container kehabisan memori fisik, maka sebagian data akan dipindahkan ke memori virtual agar container tetap berjalan. Namun, jika memori virtual juga habis maka container akan dihentikan.

    Misalnya kita set memori fisik (-m) ke 300 MB dan memori virtual --memory-swap ke 1g, maka container dapat menggunakan memori fisik sampai limit 300 MB dan memori virtual sampai limit 700 MB.

    Kenapa 700 MB? Sesuai dengan penjelasan sebelumnya memory-swap adalah batasan total untuk penggunaan RAM dan Swap. Itu berarti (1 GB - 300 MB) jadinya 700 MB.
  4. --cpus
    Untuk menentukan jumlah waktu CPU (CPU Time) yang dapat digunakan oleh container, di docker sendiri kita bisa mengatur jumlah cpu menggunakan pecahan (0.1, 0.5 dan seterusnya).
  5. --cpus-shares
    Untuk mengatur prioritas akses CPU, semakin tinggi kita mengatur nilainya maka priotas yang diberikan semakin besar. Cpu Shares menggunakan bilangan bulat dalam pengguannya, nilai default yang diberikan di angka (1024).

    Misalnya kita memiliki 2 container :
    Container A dengan (--cpus-shares=1024)
    Container B dengan (--cpus-shares=512)

    Ketika kedua container berjalan bersamaan, maka Container A akan mendapatkan waktu CPU 2 kali lipat dibandingkan Container B.
  6. --cpuset-cpus
    Untuk menentukan CPU secara spesifik yang akan digunakan oleh container. Misalkan kita memberikan 4 CPU untuk Docker, maka kita bisa memilih CPU mana yang akan kita gunakan.

    Contoh ;
    Container A dengan (--cpuset-cpus=0,1)
    Container B dengan (--cpuset-cpus=2,3)

    Itu berarti Container A akan menggunakan CPU 0 dan 1, sedangkan Container B akan menggunakan CPU 2 dan 3.
    Dari 2 contoh diatas, kita hanya menggunakan 2 digit untuk penggunaan CPU. Namun, kita juga bisa menggunakan beberapa CPU sekaligus.

    Untuk menggunakan beberapa CPU sekaligus kita bisa mengunggakn dash (-) daripada koma (,). Contohnya kita ingin menggunakan 3 CPU dari 4 CPU yang telah diberikan.

    Maka kita bisa menggunakan CLI berikut : --cpuset-cpus=0-2
Implementasi Resource Limits

    Sebelumnya jika temen-temen pengguna MacOs dan Windows kita bisa mengatur Resource yang diberikan untuk Docker pada menu pengaturan. Untuk Linux sendiri Resource akan langsung ambil dari sistem hostnya.


    Jika temen-temen mengikuti tutorial dari awal, kita sudah memiliki 2 container (container mysql dan pma). Untuk melihat Resource yang digunakan oleh 2 container teresebut kita bisa menggunakan perintah :

docker stats


Gunakan (ctrl + c) untuk keluar dari stats
    Temen-temen bisa melihat pada kolom (MEM USAGE / LIMIT), dua Container tersebut menggunakan semua Memori (RAM) yang telah kita berikan untuk Docker pada pengaturan Resource. Jika Containernya masih sedikit mungkin kita akan merasa aman-aman saja, tapi jika sudah banyak dan memakan semua (CPU dan RAM) tentu itu tidak baik.

    Untuk mengatasi hal ini, kita bisa menggunakan Resource Limits. Tujuannya agar Container memiliki batasan dalam penggunaan CPU dan RAM. Jika tidak melakukan pembatasan maka akan memberikan beberapa dampak seperti :

  1. Penggunaan Swap Memory
    Kinerja dari Swap Memory tentunya lebih lambat daripada Memori (RAM), kemudian jita Swap Memory sudah habis ada kemungkinan Container mengalami kegagalan atau crash.
  2. CPU
    Jika semua core CPU digunakan, hal ini dapat menyebabkan penurunan kinerja, terjadinya bottleneck, dan membuat aplikasi lain yang berjalan di host menjadi sangat lambat.
  3. Persaingan Untuk Mendapatkan Resource
    Jika satu container menggunakan hampir semua resource, container lain akan kesulitan mendapatkan resource yang cukup, sehingga kinerjanya menjadi tidak optimal.
  4. Overhead Pada Docker Daemon
    Docker Daemon juga membutuhkan resource untuk mengelola container. Jika resource habis, Docker Daemon dapat kewalahan dalam menangani banyak container, hal ini bisa menyebabkan overhead atau penurunan kinerja pada Docker itu sendiri.
Sekarang kita akan mencoba untuk implementasi Resource Limits pada kedua Container yang sebelumnya telah kita buat, saya akan membuat Container baru supaya perbedaannya bisa terlihat.

  1. Membuat Container Dengan Membatasi CPU dan RAM


  2. Melihat Resource Yang Digunakan


    Temen-temen bisa melihat pada MEM USAGE / LIMIT, pma-second-container akan memakai  penggunaan RAM sebesar 500 MB dan mysql-second-container akan memakai penggunaan CPU sebesar 1 GB.
Catatan : Pada Docker Stats kita tidak bisa melihat batasan waktu untuk CPU (CPU Time), namun jika kita sudah memberikan batasan seperti pada container mysql-second-container. Jika Container tersebut mencapai 100% itu sebenernya 100% dari 2 (CPU Time) yang telah di berikan sebelumnya.

Apa Itu Docker Stats?

    Docker stas adalah perintah bawaan dari Docker yang digunakan untuk monitoring penggunaan resource dan statistik real-time dari container-container yang sedang berjalan.

Kita juga bisa melakukan filter pada Docker Stats :

docker stats [nama_container]


    
Mungkin itu saja yang bisa kita pelajari dari materi kali ini. Semoga materinya dapat membantu teman-teman memahami tentang Docker Resource Limits dan Stats. Jika teman-teman memiliki pertanyaan atau ingin berbagi pengalaman, silakan ketikkan pada kolom komentar di bawah.

Sedikit Tentang Saya :

    Sebagai seorang programmer profesional dengan pengalaman sekitar 4 tahun di bidang IT, saya siap membantu Anda dengan berbagai kebutuhan konsultasi.

Jangan ragu untuk menghubungi saya melalui WhatsApp.

Sampai jumpa di tutorial berikutnya!

Kontak Saya :
Email : ronisurya.115@gmail.com
WhatsApp : 081222821596
Website : Roni Surya

Tutorial Selanjutnya : Tutorial Docker - Dockerfile

Tutorial Sebelumnya :

  1. Tutorial Docker - Network
  2. Tutorial Docker - Volume
  3. Tutorial Docker - Implementasi Image dan Container
  4. Tutorial Docker - Image dan Container
  5. Tutorial Docker - Mengenal Docker dan Konsep Kontainer
Lebih baru Lebih lama