Dalam manajemen memori Linux, slab_unreclaimable adalah memori yang dialokasikan oleh slab allocator dan ditandai sebagai tidak dapat direklamasi. Rasio tinggi antara memori yang tidak dapat direklamasi terhadap total memori sistem dapat mengurangi ketersediaan memori dan menurunkan performa sistem. Topik ini menjelaskan cara memecahkan masalah penggunaan memori slab_unreclaimable yang tinggi pada sistem Alibaba Cloud Linux.
Gejala
Saat menjalankan perintah cat /proc/meminfo | grep "SUnreclaim" pada instans Linux untuk memeriksa nilai SUnreclaim, Anda mungkin menemukan nilai tersebut cukup tinggi (misalnya, SUnreclaim: 6069340 kB). Jika nilai ini melebihi 10% dari total memori sistem, hal ini mengindikasikan penggunaan memori slab_unreclaimable yang berlebihan dan kemungkinan adanya memory leak pada slab.
Penyebab
Dalam manajemen memori Linux, slab adalah mekanisme caching yang digunakan kernel untuk mengalokasikan blok memori kecil secara efisien. Komponen atau driver kernel meminta memori dari slab allocator melalui antarmuka alokasi memori seperti kmalloc. Jika komponen atau driver tersebut gagal melepaskan memori dengan benar, jumlah memori yang tidak dapat direklamasi akan meningkat, sehingga mengurangi memori yang tersedia.
Langkah pemecahan masalah
Hubungkan ke instans Linux yang bermasalah.
Untuk informasi selengkapnya, lihat Pilih metode koneksi remote ECS.
Jalankan perintah berikut untuk mengidentifikasi slab yang menggunakan banyak
objectsatau memori besar serta ditandai sebagai unreclaimable.Lihat informasi slab yang paling banyak menggunakan
objectsatau memori.slabtop -s -aPada output perintah, catat nama slab (kolom
NAME) yang memiliki nilai tinggi pada kolomOBJ/SLAB.Periksa apakah slab tersebut bersifat unreclaimable.
Pada perintah berikut, ganti
<slab NAME>dengan nama slab yang memiliki nilai tinggi pada kolomOBJ/SLABdari langkah sebelumnya.cat /sys/kernel/slab/<slab NAME>/reclaim_accountSebagai contoh, periksa apakah slab bernama
kmalloc-192bersifat unreclaimable.cat /sys/kernel/slab/kmalloc-192/reclaim_accountHasil 0 menunjukkan slab tersebut unreclaimable, sedangkan hasil 1 menunjukkan reclaimable.
Identifikasi penyebab tingginya penggunaan memori slab_unreclaimable.
Anda dapat menggunakan tool crash untuk analisis statis atau tool perf untuk analisis dinamis guna menemukan penyebab memory leak pada slab. Dalam skenario ini, nama slab yang mengalami memory leak adalah
kmalloc-192.Analisis statis menggunakan tool crash
Jalankan perintah berikut untuk menginstal crash tool.
sudo yum install crash -yInstal paket kernel-debuginfo.
Alibaba Cloud Linux 3
sudo yum install -y kernel-debuginfo-<kernel_version> --enablerepo=alinux3-plus-debugCatatanGanti
kernel_versiondengan versi kernel aktual sistem Anda. Gunakan perintahuname -runtuk mengetahui versi kernel.Alibaba Cloud Linux 2
sudo yum install kernel-debuginfo -y
Jalankan tool crash.
sudo crashDi dalam tool crash, jalankan perintah berikut untuk melihat statistik memori slab
kmalloc-192.kmem -S kmalloc-192Jika informasi statistik yang dikembalikan berjumlah besar, Anda dapat menampilkan hanya beberapa baris terakhir, misalnya 10 baris.
kmem -S kmalloc-192 | tail -n 10Berikut adalah contoh output yang dikembalikan:
SLAB MEMORY NODE TOTAL ALLOCATED FREE ffffea004c94e780 ffff88132539e000 0 42 29 13 ffffea004cbef900 ffff88132fbe4000 0 42 40 2 ffffea000a0e6280 ffff88028398a000 0 42 40 2 ffffea004bfa8000 ffff8812fea00000 0 42 41 1 ffffea006842b380 ffff881a10ace000 0 42 41 1 ffffea0009e7dc80 ffff880279f72000 0 42 34 8 ffffea004e67ae80 ffff881399eba000 0 42 40 2 ffffea00b18d6f80 ffff882c635be000 0 42 42 0Pada statistik untuk
ffff88028398a000, memori bebas (kolomFREE) rendah, sedangkan memori yang dialokasikan (kolomALLOCATED) tinggi.Di dalam tool crash, jalankan perintah berikut untuk melihat detail memori
ffff88028398a000.rd ffff88028398a000 512 -SPerintah ini menghasilkan banyak informasi. Ikuti petunjuk untuk mencetak beberapa halaman guna dianalisis. Contohnya:
Jika fungsi
put_cred_rcumuncul berulang kali dalam informasi yang dikembalikan, cari fungsiput_cred_rcudalam kode sumber kernel Linux.void __put_cred(struct cred *cred) { call_rcu(&cred->rcu, put_cred_rcu); }Fungsi
put_cred_rcudigunakan untuk melepaskan struktur cred secara asinkron. Kehadiranput_cred_rcudi akhir struktur cred mengindikasikan adanya memory leak pada slab pada struktur cred kernel.
Analisis dinamis menggunakan tool perf
Instal tool perf.
sudo yum install perf -yGunakan perf untuk merekam alokasi memori yang tidak dilepaskan pada
kmalloc-192selama 200 detik.sudo perf record -a -e kmem:kmalloc --filter 'bytes_alloc == 192' -e kmem:kfree --filter ' ptr != 0' sleep 200Simpan data rekaman ke file sementara di direktori saat ini.
Dalam contoh ini, file sementara diberi nama testperf.txt.
sudo perf script > testperf.txtTampilkan isi file testperf.txt.
cat testperf.txtPeriksa entri yang tidak memiliki memori bebas (
free), lalu telusuri fungsi terkait dalam kode sumber kernel Linux untuk mengidentifikasi penyebab memory leak.
Setelah menentukan jalur pemanggilan fungsi atau struktur data kernel yang terdampak menggunakan tool seperti crash dan perf, identifikasi sumber spesifik memory leak tersebut dengan bantuan developer kernel atau engineer operasi dan maintenance (O&M) profesional, lalu atasi masalahnya.
Berikut beberapa solusi yang mungkin:
Upgrade kernel atau terapkan Patch.
Sesuaikan parameter kernel.
Mulai ulang layanan atau modul yang terdampak.
Optimalkan aplikasi atau driver.
Mulai ulang sistem.
Referensi
Memory leak pada slab mengurangi memori yang tersedia untuk aplikasi pada suatu instans dan menyebabkan fragmentasi memori. Hal ini dapat memicu OOM (out-of-memory) Killer sistem dan menyebabkan fluktuasi performa sistem.
Fragmentasi memori: Mitigasi fragmentasi memori Linux
Memory leak pada Polkit: Cara mengatasi memory leak pada polkit di Alibaba Cloud Linux 2?
OOM Killer sistem: Memecahkan masalah OOM Killer