Batas memori dan CPU untuk container
Cara menetapkan batas memori dan CPU untuk container, mengapa tanpa itu satu layanan menjatuhkan semua yang lain, dan cara mengetahui bahwa sebuah proses dihentikan oleh kernel.
Diperbarui 23 Agustus 2026
Secara default, sebuah container dapat mengambil seluruh memori dan seluruh core pada mesin. Pada VDS-1 dengan dua gigabyte, hal ini berakhir secara terprediksi: satu layanan membengkak, kernel mulai membunuh proses, dan yang tumbang bukan layanan itu melainkan basis data di sebelahnya.
Cara menetapkan batas
services:
app:
image: ghcr.io/example/app:1.5.0
deploy:
resources:
limits:
memory: 768M
cpus: "1.0"
reservations:
memory: 256M
Compose menerapkan deploy.resources.limits bahkan dengan docker compose up -d biasa. Padanan untuk docker run:
docker run -d --memory 768m --cpus 1.0 --memory-swap 768m <image>
Menetapkan --memory-swap sama dengan --memory melarang swapping: crash yang jujur lebih baik daripada mesin yang nyaris tidak bergerak selama berjam-jam.
Berapa banyak yang harus dialokasikan
Mulailah dari tier Anda dan sisakan sedikit ruang untuk sistem.
| Tier | Memori | Batas total container yang wajar |
|---|---|---|
| VDS-1 | 2 GB | hingga 1,5 GB |
| VDS-2 | 4 GB | hingga 3 GB |
| VDS-3 | 8 GB | hingga 6,5 GB |
| VDS-4 | 16 GB | hingga 14 GB |
| VDS-5 | 24 GB | hingga 21 GB |
| VDS-6 | 32 GB | hingga 29 GB |
Sisanya dibutuhkan oleh sistem, cache berkas, dan Docker itu sendiri. Jumlah batas yang melebihi jumlah memori bukanlah kesalahan konfigurasi — melainkan bencana yang menunggu terjadi.
Untuk CPU: cpus: "1.0" berarti satu core penuh. VDS-1 hanya memiliki satu core, jadi tidak ada gunanya membatasi CPU di sana, tetapi pada VDS-4 ke atas ada baiknya mencegah konfigurasi server mengambil keenam core.
Apa yang sebenarnya terpakai
docker stats --no-stream
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.CPUPerc}}"
free -h
Pantau layanan selama sehari di bawah beban dan tetapkan batas sekitar satu setengah kali puncaknya. Batas yang terlalu ketat lebih buruk daripada tidak ada sama sekali: layanan akan restart tepat saat Anda paling membutuhkannya.
htopdanbtoplayar penuh hanya berfungsi di konsol "Screen" (VNC). Konsol teks tidak meneruskan ukuran jendela, di sana selalu 80×24, dan antarmukanya berantakan. Untuk pengukuran cepat di konsol teks, gunakandocker stats --no-streamdanfree -h.
Cara mengetahui bahwa proses dibunuh karena memori
docker inspect -f '{{.State.ExitCode}} {{.State.OOMKilled}}' <container>
sudo dmesg -T | grep -i -E "out of memory|killed process"
Kode keluar 137 disertai OOMKilled: true adalah vonis yang tidak ambigu. Dari sana Anda punya dua pilihan: naikkan batas jika terlalu rendah, atau cari tahu mengapa aplikasi terus bertumbuh — kebocoran tidak disembuhkan dengan menambah memori, hanya ditunda.
Java dan kasus khusus lainnya
Java virtual machine terkadang masih melihat memori host alih-alih batas container, dan mengukur heap dengan ruang cadangan yang sebenarnya tidak ada. Tetapkan secara eksplisit:
environment:
JAVA_TOOL_OPTIONS: "-Xmx512m -Xms256m"
Hal yang sama berlaku untuk PostgreSQL (shared_buffers) dan layanan apa pun yang memiliki pool sendiri.
Kesalahan umum
- Tidak menetapkan batas sama sekali. Penyebab paling umum dari "mesin membeku, tidak ada yang merespons".
- Batasnya ada, tetapi tidak ada health check. Container dibunuh dan tidak pernah dijalankan ulang. Tambahkan
restart: unless-stoppeddanhealthcheck— lihat memperbarui container. - Anda lupa soal disk. Anda membatasi memori, tetapi penulisan membentur batas: lihat kecepatan disk.