Kontainerisasi aplikasi Java Anda
Artikel ini memberikan gambaran umum tentang strategi dan pengaturan yang direkomendasikan untuk kontainerisasi aplikasi Java.
Saat Anda membuat kontainer aplikasi Java, pertimbangkan dengan cermat berapa banyak waktu CPU yang akan tersedia kontainer. Kemudian pertimbangkan berapa banyak memori yang akan tersedia baik dalam hal jumlah total memori, dan ukuran timbunan Java Virtual Machine (JVM). Di lingkungan kontainer, aplikasi mungkin memiliki akses ke semua prosesor dan oleh karena itu dapat menjalankan beberapa utas secara paralel. Namun, umum bahwa kontainer memiliki kuota CPU yang diterapkan yang dapat membatasi akses ke CPU.
JVM memiliki heuristik untuk menentukan jumlah "prosesor yang tersedia" berdasarkan kuota CPU, yang dapat secara dramatis memengaruhi performa aplikasi Java. Memori yang dialokasikan untuk kontainer itu sendiri dan ukuran area timbunan untuk JVM sama pentingnya dengan prosesor. Faktor-faktor ini akan menentukan perilaku pengumpul sampah (GC) dan performa keseluruhan sistem.
Membuat kontainer aplikasi baru
Saat Anda membuat kontainer beban kerja Java untuk aplikasi baru, Anda harus mempertimbangkan dua hal saat memikirkan memori:
- Memori yang dialokasikan untuk kontainer itu sendiri.
- Jumlah memori yang tersedia untuk proses Java.
Memahami ergonomi default JVM
Aplikasi memerlukan titik awal dan pengaturan. JVM memiliki ergonomi default dengan nilai yang telah ditentukan sebelumnya yang didasarkan pada jumlah prosesor dan jumlah memori yang tersedia dalam sistem. Nilai default yang diperlihatkan dalam tabel berikut digunakan saat JVM dimulai tanpa bendera atau parameter startup tertentu.
Tabel berikut ini memperlihatkan GC default yang digunakan untuk sumber daya yang tersedia:
Sumber daya tersedia | Default GC |
---|---|
Sejumlah prosesor Memori hingga 1791 MB |
SerialGC |
2+ prosesor Memori 1792 MB atau lebih |
G1GC |
Tabel berikut menunjukkan ukuran timbunan maksimum default tergantung pada berapa banyak memori yang tersedia di lingkungan tempat JVM berjalan:
Memori tersedia | Ukuran timbunan maksimum default |
---|---|
Hingga 256 MB | 50% memori yang tersedia |
256 MB hingga 512 MB | ~127MB |
Lebih dari 512 MB | 25% memori yang tersedia |
Ukuran timbunan awal default adalah 1/64 memori yang tersedia.
Nilai-nilai ini berlaku untuk OpenJDK 11 dan yang lebih baru, dan untuk sebagian besar distribusi, termasuk Microsoft Build of OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK, dan lainnya.
Menentukan memori kontainer
Pilih jumlah memori kontainer yang akan melayani beban kerja Anda dengan terbaik, tergantung pada kebutuhan aplikasi Anda dan pola penggunaannya yang khas. Misalnya, jika aplikasi Anda membuat grafik objek besar, maka Anda mungkin akan membutuhkan lebih banyak memori daripada yang Anda butuhkan untuk aplikasi dengan banyak grafik objek kecil.
Tip
Jika Anda tidak tahu berapa banyak memori yang akan dialokasikan, titik awal yang baik adalah 4 GB.
Menentukan memori tumpukan JVM
Ketika Anda mengalokasikan memori timbunan JVM, ketahuilah bahwa JVM membutuhkan lebih banyak memori daripada hanya apa yang digunakan untuk timbunan JVM. Ketika Anda mengatur memori timbunan JVM maksimum, memori tersebut tidak boleh sama dengan jumlah memori kontainer karena itu akan menyebabkan kesalahan Kontainer Kehabisan Memori (OOM) dan crash kontainer.
Tip
Alokasikan 75% memori kontainer untuk timbunan JVM.
Pada OpenJDK 11 dan yang lebih baru, Anda dapat mengatur ukuran tumpukan JVM dengan cara berikut:
Deskripsi | Bendera | Contoh |
---|---|---|
Nilai tetap | -Xmx |
-Xmx4g |
Nilai dinamis | -XX:MaxRAMPercentage |
-XX:MaxRAMPercentage=75 |
Ukuran timbunan minimum/awal
Di mana lingkungan dijamin memiliki sejumlah memori yang dicadangkan ke instans JVM, seperti dalam kontainer, Anda harus mengatur ukuran tumpukan minimum - atau ukuran tumpukan awal - ke ukuran yang sama dengan ukuran tumpukan maksimum. Pengaturan ini menunjukkan kepada JVM bahwa ia tidak boleh melakukan tugas membebaskan memori ke OS.
Untuk mengatur ukuran tumpukan minimum, gunakan -Xms
untuk jumlah absolut atau -XX:InitialRAMPercentage
untuk jumlah persentase.
Penting
Bendera -XX:MinRAMPercentage
, terlepas dari apa namanya, digunakan untuk mengatur persentase RAM maksimum default untuk sistem dengan HINGGA 256 MB RAM yang tersedia dalam sistem.
Tentukan GC mana yang akan digunakan
Sebelumnya, Anda menentukan jumlah memori tumpukan JVM untuk memulai. Langkah selanjutnya adalah memilih GC Anda. Jumlah memori tumpukan JVM maksimum yang Anda miliki sering kali menjadi faktor dalam memilih GC Anda. Tabel berikut menjelaskan karakteristik setiap GC.
Faktor | SerialGC | ParalelGC | G1GC | ZGC | ShenandoahGC |
---|---|---|---|---|---|
Jumlah core | 1 | 2 | 2 | 2 | 2 |
Multi-utas | Tidak | Ya | Ya | Ya | Ya |
Ukuran timbunan Java | <4 GByte | <4 GByte | >4 GByte | >4 GByte | >4 GByte |
Jeda | Ya | Ya | Ya | Ya (<1 ms) | Ya (<10 mdtk) |
Overhead | Minimal | Minimal | Sedang | Sedang | Sedang |
Efek latensi ekor | Sangat Penting | Sangat Penting | Sangat Penting | Kurang Penting | Sedang |
Versi JDK | Semua | Semua | JDK 8+ | JDK 17+ | JDK 11+ |
Paling cocok untuk | Timbunan kecil inti tunggal | Timbunan kecil multi-inti atau beban kerja batch dengan ukuran timbunan apa pun | Responsif dalam tumpukan sedang hingga besar (interaksi request-response/DB) | Responsif dalam tumpukan sedang hingga besar (interaksi request-response/DB) | Responsif dalam tumpukan sedang hingga besar (interaksi request-response/DB) |
Tip
Untuk sebagian besar aplikasi layanan mikro tujuan umum, mulailah dengan GC Paralel.
Menentukan berapa banyak inti CPU yang diperlukan
Untuk GC apa pun selain SerialGC, kami merekomendasikan dua atau lebih inti vCPU - atau setidaknya 2000m
cpu_limit di Kubernetes. Kami tidak menyarankan untuk memilih apa pun yang kurang dari 1 inti vCPU pada lingkungan kontainer.
Tip
Jika Anda tidak tahu berapa banyak inti yang akan dimulai, pilihan yang baik adalah 2 inti vCPU.
Pilih titik awal
Sebaiknya mulai dengan dua replika atau instans di lingkungan orkestrasi kontainer seperti Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps, dan Azure App Service. Tabel berikut ini meringkas titik awal yang direkomendasikan untuk kontainerisasi aplikasi Java baru Anda.
Core vCPU | Memori kontainer | Ukuran timbunan JVM | GC | Replika |
---|---|---|---|---|
2 | 4 GB | 75% | ParalelGC | 2 |
Parameter JVM yang akan digunakan adalah: -XX:+UseParallelGC -XX:MaxRAMPercentage=75
Membuat kontainer aplikasi (lokal) yang sudah ada
Jika aplikasi Anda sudah berjalan di tempat atau di VM di cloud, kami sarankan Anda mulai dengan:
- Jumlah memori yang sama dengan yang saat ini dapat diakses aplikasi.
- Jumlah CPU (inti vCPU) yang sama dengan aplikasi yang saat ini telah tersedia.
- Parameter JVM yang sama dengan yang saat ini Anda gunakan.
Jika kombinasi inti vCPU dan/atau memori kontainer tidak tersedia, pilih yang terdekat, bulatkan core vCPU dan memori kontainer.
Langkah berikutnya
Sekarang setelah Anda memahami rekomendasi umum untuk kontainerisasi aplikasi Java, lanjutkan ke artikel berikut untuk membuat garis besar kontainerisasi: