Ketika memory reclamation tidak mampu mengatasi kondisi memori rendah pada sistem Linux, kernel akan memanggil OOM Killer untuk menghentikan proses secara paksa. Topik ini mencakup penyebab umum kejadian OOM Killer pada Alibaba Cloud Linux dan cara mengatasinya.
Deskripsi masalah
Log berikut menunjukkan proses test yang 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/2014
Potensi penyebab
Kejadian OOM Killer disebabkan oleh memori global yang tidak mencukupi atau memori cgroup yang tidak mencukupi. Tabel berikut mencantumkan skenario umum:
|
Penyebab |
Contoh skenario |
|
Memori cgroup tidak mencukupi |
Pada log ini, OOM Killer dipicu untuk cgroup
Penyebab: cgroup |
|
Memori cgroup induk tidak mencukupi |
Di sini, proses
Penyebab: cgroup induk |
|
Memori global tidak mencukupi |
Pada log ini,
Penyebab: Memori bebas turun di bawah ambang batas minimum dan memory reclamation tidak mampu membebaskan cukup halaman memori. |
|
Memori tidak mencukupi pada suatu node memori |
Indikator utama dalam log ini:
Penyebab: Pada arsitektur NUMA, |
|
Memori sistem buddy tidak mencukupi akibat fragmentasi memori |
Indikator utama dalam log ini:
Penyebab: Fragmentasi memori mencegah sistem buddy mengalokasikan blok kontigu dengan ukuran yang dibutuhkan, meskipun total memori bebas mencukupi. Catatan
Sistem buddy adalah pengalokasi memori kernel Linux yang mengelola blok kontigu dengan berbagai ukuran untuk mengurangi fragmentasi. |
Solusi
Atasi masalah berdasarkan penyebabnya.
Memori tidak mencukupi dalam cgroup atau cgroup induk
Hentikan proses yang tidak diperlukan untuk membebaskan memori. Jika workload Anda memerlukan lebih banyak memori, lakukan upgrade instans.
-
Lakukan upgrade instans.
-
Setelah upgrade, sesuaikan secara manual batas memori cgroup.
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
Periksa area berikut:
-
Periksa Penggunaan memori
slab_unreclaimable.cat /proc/meminfo | grep "SUnreclaim"slab_unreclaimableadalah memori yang tidak dapat dikembalikan oleh sistem. Jika melebihi 10% dari total memori, kemungkinan terjadi memory leak slab. Atasi masalah ini menggunakan Apa yang harus saya lakukan jika instans memiliki persentase memori slab_unreclaimable yang tinggi? Jika masalah berlanjut, ajukan tiket. -
Periksa Penggunaan memori
systemd.cat /proc/1/status | grep "RssAnon"Kernel melewati proses 1 (
systemd) saat melakukan OOM kill, sehingga Penggunaan memorisystemdsebaiknya tidak melebihi 200 MB. Jika Penggunaan memori terlalu tinggi, perbaruisystemdke versi yang lebih baru. -
Tinjau kinerja Transparent Huge Pages (THP).
THP dapat menyebabkan pembengkakan memori yang memicu kejadian OOM. Untuk menguranginya, sesuaikan pengaturan THP seperti yang dijelaskan dalam Bagaimana cara menggunakan THP untuk menyetel kinerja di Alibaba Cloud Linux?
Memori tidak mencukupi pada suatu node memori
Konfigurasi ulang cpuset.mems agar cgroup dapat menggunakan memori dari node tambahan.
-
Identifikasi node memori dalam sistem Anda.
cat /proc/buddyinfo -
Konfigurasikan parameter
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
Lakukan kompaksi memori selama jam sepi:
sudo bash -c 'echo 1 > /proc/sys/vm/compact_memory'