Ketika sistem operasi Linux kekurangan memori, sistem terlebih dahulu memicu memory reclamation untuk membebaskan memori bagi proses lain. Jika memory reclamation gagal mengatasi kondisi kekurangan memori, sistem akan memanggil Out of Memory (OOM) Killer untuk secara paksa menghentikan suatu proses. Tindakan ini membebaskan memori dan mengurangi tekanan memori. Topik ini menjelaskan penyebab dan solusi untuk event OOM Killer pada sistem operasi Alibaba Cloud Linux.
Gejala
Cuplikan log berikut merupakan contoh event OOM Killer pada sistem operasi Alibaba Cloud Linux. Proses test memicu OOM Killer.
565 [Sat Sep 11 12:24:42 2021] test invoked oom-killer: gfp_mask=0x62****(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), nodemask=(null), order=0, oom_score_adj=0
566 [Sat Sep 11 12:24:42 2021] test cpuset=/ mems_allowed=0
567 [Sat Sep 11 12:24:42 2021] CPU: 1 PID: 29748 Comm: test Kdump: loaded Not tainted 4.19.91-24.1.al7.x86_64 #1
568 [Sat Sep 11 12:24:42 2021] Hardware name: Alibaba Cloud Alibaba Cloud ECS, BIOS e62**** 04/01/2014Potensi penyebab
OOM Killer dipicu oleh ketersediaan memori yang tidak mencukupi. Masalah ini terjadi karena dua alasan utama: memori global pada instans tidak mencukupi atau memori dalam cgroup tidak mencukupi. Tabel berikut menjelaskan skenario umum dan penyebab event OOM Killer:
Jenis Alasan | Contoh skenario |
Memori cgroup tidak mencukupi | Pada contoh log berikut, OOM Killer dipicu untuk cgroup Penyebab: Penggunaan memori cgroup |
Memori cgroup induk tidak mencukupi | Pada contoh log berikut, proses Penyebab: OOM Killer dipicu karena cgroup induk |
Memori global tidak mencukupi | Pada contoh log berikut, Penyebab: OOM Killer dipicu karena memori bebas instans turun di bawah watermark rendah, dan memory reclamation gagal mengatasi kekurangan memori tersebut. |
Memori pada node memori tidak mencukupi | Pada contoh log berikut, beberapa baris penting menunjukkan masalahnya:
Penyebab: Dalam arsitektur Non-Uniform Memory Access (NUMA), sistem operasi dapat memiliki beberapa node memori. Anda dapat menjalankan perintah cat /proc/buddyinfo untuk melihat informasi tentang node tersebut. Jika parameter |
Memori sistem buddy tidak mencukupi akibat fragmentasi memori | Berikut adalah analisis catatan log dari skenario OOM Killer:
Alasan: Jika sistem buddy kehabisan memori selama proses alokasi memori, sistem operasi memanggil OOM Killer untuk membebaskan memori bagi sistem buddy. Catatan Sistem buddy di Linux adalah mekanisme kernel untuk manajemen memori. Sistem ini mengurangi fragmentasi memori serta secara efisien mengalokasikan dan dealokasikan blok memori dengan berbagai ukuran. |
Solusi
Ikuti langkah-langkah berikut untuk mendiagnosis dan menyelesaikan masalah berdasarkan skenario OOM Killer spesifik.
Memori tidak mencukupi pada cgroup anak atau induk
Evaluasi proses-proses yang mengonsumsi memori pada instans Anda dan hentikan proses yang tidak diperlukan untuk membebaskan memori. Jika workload Anda membutuhkan lebih banyak memori, Anda dapat melakukan upgrade instans untuk meningkatkan kapasitas memorinya.
Lakukan upgrade instans.
Untuk informasi selengkapnya, lihat Ikhtisar perubahan konfigurasi instans.
Anda dapat menyesuaikan batas memori cgroup secara manual agar sesuai dengan peningkatan memori aktual.
sudo bash -c 'echo <value> > /sys/fs/cgroup/memory/<cgroup_name>/memory.limit_in_bytes'Ganti
<value>dengan batas memori baru untuk cgroup dalam satuan byte dan<cgroup_name>dengan nama cgroup Anda.
Memori global tidak mencukupi
Jika memori global Anda tidak mencukupi, selidiki area-area berikut:
Periksa penggunaan memori slab_unreclaimable.
cat /proc/meminfo | grep "SUnreclaim"slab_unreclaimable adalah memori yang tidak dapat direklamasi oleh sistem. Jika nilainya melebihi 10% dari total memori, hal ini dapat mengindikasikan adanya memory leak pada slab. Jika Anda mencurigai adanya memory leak, lakukan troubleshooting secara manual. Untuk informasi selengkapnya, lihat Apa yang harus saya lakukan jika instans memiliki persentase memori slab_unreclaimable yang tinggi?. Jika masalah tetap berlanjut, kirim tiket untuk mendapatkan dukungan teknis.
Periksa penggunaan memori systemd.
cat /proc/1/status | grep "RssAnon"Ketika kernel memicu OOM Killer, proses 1 (systemd) dilewati. Oleh karena itu, penggunaan memori systemd biasanya tidak boleh melebihi 200 MB. Jika Anda mengamati penggunaan yang tidak wajar, coba perbarui tools systemd ke versi yang lebih baru.
Lihat performa Transparent Huge Pages (THP).
Mengaktifkan THP dapat menyebabkan pembengkakan memori, yang berpotensi memicu event OOM Killer. Anda dapat menyetel THP untuk mengurangi masalah ini. Untuk informasi selengkapnya, lihat Bagaimana cara menggunakan THP untuk menyetel performa di Alibaba Cloud Linux?.
Memori tidak mencukupi pada node memori tertentu
Untuk mengatasi event OOM Killer yang disebabkan oleh kekurangan memori pada node memori tertentu, konfigurasi ulang antarmuka cpuset.mems agar cgroup dapat menggunakan memori dari node lain yang tersedia.
Jalankan perintah berikut untuk menghitung jumlah node memori dalam sistem.
cat /proc/buddyinfoKonfigurasikan antarmuka
cpuset.mems.sudo bash -c 'echo <value> > /sys/fs/cgroup/cpuset/<cgroup_name>/cpuset.mems'Ganti
<value>dengan nomor node memori yang sesuai dan<cgroup_name>dengan nama cgroup Anda.Sebagai contoh, jika sistem Anda memiliki tiga node (Node 0, Node 1, dan Node 2) dan Anda ingin cgroup menggunakan memori dari Node 0 dan Node 2, atur
<value>menjadi0,2.
Memori sistem buddy tidak mencukupi akibat fragmentasi memori
Untuk mengatasi event OOM Killer yang disebabkan oleh fragmentasi memori, lakukan memory compaction selama jam sepi. Untuk memulai memory compaction, jalankan perintah berikut:
sudo bash -c 'echo 1 > /proc/sys/vm/compact_memory'