Jika aplikasi Anda dikembangkan dalam Java dan ruang heap JVM diatur terlalu kecil, masalah kehabisan memori (OOM) dapat terjadi. Anda dapat menggunakan Container Network File System (CNFS) sebagai media pencatatan log dengan memasangnya ke direktori yang sesuai di dalam kontainer. Saat terjadi OOM pada JVM, CNFS dapat menyimpan log ke direktori tersebut. Topik ini menjelaskan cara menggunakan CNFS untuk mengumpulkan dump heap JVM secara otomatis saat keluar tidak normal.
Prasyarat
Anda telah menggunakan CNFS untuk mengelola sistem file NAS. Untuk informasi selengkapnya, lihat Kelola sistem file NAS menggunakan CNFS (disarankan).
Container Network File System (CNFS) mengabstraksikan penyimpanan file Alibaba Cloud sebagai objek Kubernetes (CRD) untuk pengelolaan independen, termasuk operasi pembuatan, penghapusan, deskripsi, pemasangan, pemantauan, dan penskalaan.
Anda telah membuat instans Container Registry Edisi Perusahaan. Untuk informasi selengkapnya, lihat Buat Instans Perusahaan.
Pertimbangan
Nilai heap maksimum (Xmx) yang diatur untuk Java harus lebih kecil daripada batas memori Pod untuk mencegah Pod mengalami OOM sebelum JVM melakukannya.
Saat menggunakan dump heap Java, kami menyarankan membuat CNFS baru dan memisahkan CNFS yang digunakan untuk operasi bisnis dari CNFS yang digunakan untuk dump heap Java. Hal ini mencegah file .hprof menjadi terlalu besar dan mengonsumsi sumber daya bisnis berlebihan selama proses dump, yang dapat memengaruhi operasi bisnis.
Citra
docker.io/filebrowser/filebrowser:v2.18.0yang digunakan dalam contoh mungkin gagal ditarik karena pembatasan akses jaringan. Anda perlu menyinkronkannya ke instans ACR Edisi Perusahaan Anda dengan cara berlangganan citra dari luar Tiongkok. Konfigurasi spesifiknya adalah sebagai berikut:Artifact Source: Docker Hub
Source Repository Coordinates: filebrowser/filebrowser
Subscription Policy: v2.18.0
Setelah menyelesaikan langganan citra, Anda perlu mengonfigurasi kebijakan tarik tanpa kata sandi antara instans ACR Edisi Perusahaan dan kluster ACK. Untuk informasi selengkapnya, lihat Tarik citra dari akun yang sama.
Prosedur
Gunakan citra contoh registry.cn-hangzhou.aliyuncs.com/acs1/java-oom-test:v1.0 sebagai program Java untuk mensimulasikan OOM dan memicu OOM JVM.
Gunakan contoh berikut untuk membuat Penyebaran bernama java-application.
Dalam contoh ini, saat memulai program Java Mycode, ukuran heap yang diminta diatur menjadi 80 MB, dan direktori dump heap adalah /mnt/oom/logs. Saat ukuran heap JVM tidak mencukupi, kesalahan HeapDumpOnOutOfMemoryError akan ditangkap.
cat << EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: java-application spec: selector: matchLabels: app: java-application template: metadata: labels: app: java-application spec: containers: - name: java-application image: registry.cn-hangzhou.aliyuncs.com/acs1/java-oom-test:v1.0 #Alamat citra program contoh dalam topik ini. imagePullPolicy: Always env: #Definisikan dua pasangan kunci-nilai: POD_NAME sebagai metadata.name dan POD_NAMESPACE sebagai metadata.namespace. - name: POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace args: - java #Perintah eksekusi. - -Xms80m #Nilai heap minimum untuk memori heap. - -Xmx80m #Nilai heap maksimum untuk memori heap. - -XX:HeapDumpPath=/mnt/oom/logs #Jalur untuk dump memori heap saat terjadi OOM. - -XX:+HeapDumpOnOutOfMemoryError #Tangkap kesalahan OOM heap. - Mycode #Program yang dieksekusi. volumeMounts: - name: java-oom-pv mountPath: "/mnt/oom/logs" #Gunakan /mnt/oom/logs sebagai direktori pemasangan di dalam kontainer. subPathExpr: $(POD_NAMESPACE).$(POD_NAME) #Gunakan $(POD_NAMESPACE).$(POD_NAME) sebagai subdirektori yang dibuat untuk menghasilkan file dump OOM di subdirektori tersebut. volumes: - name: java-oom-pv persistentVolumeClaim: claimName: cnfs-nas-pvc #Gunakan PVC CNFS bernama cnfs-nas-pvc. --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: cnfs-nas-pvc spec: accessModes: - ReadWriteMany storageClassName: alibabacloud-cnfs-nas resources: requests: storage: 70Gi # Jika fitur kuota direktori diaktifkan, bidang storage berlaku, dan jumlah maksimum data yang dapat ditulis ke direktori yang dibuat secara dinamis adalah 70 GiB. --- EOFMelalui Pusat Insiden di Konsol Container Service, Anda dapat melihat bahwa Pod memiliki event peringatan Back-off restarting, yang menunjukkan bahwa aplikasi java-application mengalami OOM.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih .
Lihat event yang sesuai.

Karena NAS saat ini tidak memiliki fungsi untuk menelusuri, mengunggah, atau mengunduh file, Anda dapat menggunakan File Browser sebagai alat akses berbasis web. Pertama, pasang titik pemasangan NAS ke rootDir File Browser, lalu buat Layanan untuk memetakan port kontainer File Browser, dan akhirnya akses file yang disimpan di NAS melalui browser.
Gunakan templat berikut untuk membuat Penyebaran File Browser dan ConfigMap yang diperlukan oleh File Browser, dengan port 80 diaktifkan secara default.
cat << EOF | kubectl apply -f - apiVersion: v1 data: .filebrowser.json: | { "port": 80, "address": "0.0.0.0" } kind: ConfigMap metadata: labels: app.kubernetes.io/instance: filebrowser app.kubernetes.io/name: filebrowser name: filebrowser namespace: default --- apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/instance: filebrowser app.kubernetes.io/name: filebrowser name: filebrowser namespace: default spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app.kubernetes.io/instance: filebrowser app.kubernetes.io/name: filebrowser template: metadata: labels: app.kubernetes.io/instance: filebrowser app.kubernetes.io/name: filebrowser spec: containers: - image: XXXX-registry-vpc.cn-hangzhou.cr.aliyuncs.com/test/test:v2.18.0 #Citra contoh docker.io/filebrowser/filebrowser:v2.18.0 mungkin gagal ditarik karena pembatasan akses jaringan. Lihat bagian pertimbangan. imagePullPolicy: IfNotPresent name: filebrowser ports: - containerPort: 80 name: http protocol: TCP resources: {} securityContext: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /.filebrowser.json name: config subPath: .filebrowser.json - mountPath: /db name: rootdir - mountPath: /rootdir name: rootdir dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 volumes: - configMap: defaultMode: 420 name: filebrowser name: config - name: rootdir persistentVolumeClaim: claimName: cnfs-nas-pvc EOFKeluaran yang diharapkan:
configmap/filebrowser unchanged deployment.apps/filebrowser configuredMasuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih .
Pada halaman Services, pilih namespace default, klik Create, lalu konfigurasikan parameter berikut.
Parameter
Contoh deskripsi
Service Name
filebrowser
Service Type
Server Load Balancer (LoadBalancer)
Load Balancer Type: Classic Load Balancer (CLB)
Pilih Create Resource, klik daftar drop-down Create CLB Resource, atur Access Method ke Internet Access, dan atur Billing Method ke Pay-as-you-go.
Untuk informasi tentang penagihan CLB, lihat Ikhtisar penagihan CLB.
Service Association
Pilih +Reference Workload Label.
Resource Type: Deployments
Resource List: filebrowser
Port Mapping
Service Port: 8080
Container Port: 80
Protocol: TCP
Dalam kotak dialog, pilih Server Load Balancer (LoadBalancer) sebagai jenis layanan. Pilih Create Resource, atur Access Method ke Internet Access, atur Billing Method ke Pay-as-you-go (PayByCLCU), dan kirimkan perubahan konfigurasi sesuai petunjuk.
Untuk informasi tentang penagihan CLB, lihat Ikhtisar penagihan CLB.
Buka browser Anda dan masukkan alamat titik akhir:8080 di bilah alamat. Anda akan melihat antarmuka login File Browser. Masukkan akun default (admin) dan kata sandi (admin) untuk mengakses interior kontainer.

Karena File Browser memasang PVC bernama cnfs-nas-pvc ke rootDir, klik ganda rootDir untuk memasuki titik pemasangan NAS.

Hasil
Di File Browser, Anda dapat melihat direktori bernama default.java-application-76d8cd95b7-prrl2. Direktori ini dihasilkan oleh aturan java-application's subPathExpr: $(POD_NAMESPACE).$(POD_NAME).

Kemudian masuk ke direktori ini untuk melihat file dump java_pid1.hprof di dalam direktori tersebut. Untuk menemukan baris kode tempat terjadinya OOM dalam program Anda, Anda dapat mengunduh java_pid1.hprof ke mesin lokal Anda dan menganalisis lebih lanjut informasi stack JVM menggunakan MAT (Eclipse Memory Analyzer Tools).
