Topik ini menjelaskan cara mendiagnosis dan mengatasi penggunaan memori slab_unreclaimable yang tinggi pada instance Elastic Compute Service (ECS) Linux.
Deskripsi masalah
Saat menjalankan perintah cat /proc/meminfo | grep "SUnreclaim" pada instance Linux untuk melihat nilai SUnreclaim, Anda menemukan bahwa nilainya besar (misalnya, SUnreclaim: 6069340 kB), yang menunjukkan jumlah memori slab_unreclaimable yang signifikan. Jika memori slab_unreclaimable mencakup lebih dari 10% dari total memori, kemungkinan terjadi kebocoran memori slab.
Penyebab
Kernel Linux menggunakan mekanisme slab allocator untuk mengelola memori. Mekanisme ini membantu mengurangi memory fragmentation dengan mengalokasikan dan dealokasi objek memori berukuran sama dari cache khusus. Memori slab_unreclaimable mengacu pada bagian cache slab yang tidak dapat ditarik kembali oleh kernel, bahkan saat terjadi tekanan memori. Memori ini tidak dapat ditarik kembali karena menyimpan objek aktif, seperti cache dentry (directory entry) dan inode. Meskipun cache ini meningkatkan performa filesystem, ukurannya dapat tumbuh secara berlebihan dan sulit dilepaskan, sehingga menyebabkan penggunaan memori slab_unreclaimable yang tinggi dan terkadang memicu OOM (Out-of-Memory) Killer.
Solusi
Hubungkan ke instance Linux untuk pemecahan masalah.
Untuk informasi lebih lanjut, lihat Metode untuk menghubungkan ke Instance ECS.
Periksa nama slab yang memiliki jumlah
objectsterbanyak atau jumlah memori terbesar yang tidak dapat ditarik kembali:Lihat informasi tentang slab yang memiliki jumlah
objectsterbanyak atau jumlah memori terbesar.slabtop -s -aPada output perintah, catat nama slab (nilai pada kolom
NAME) yang memiliki nilai tertinggi pada kolomOBJ/SLAB.Periksa apakah memori slab tersebut tidak dapat ditarik kembali.
Pada perintah berikut, ganti
<slab NAME>dengan nama slab yang diperoleh pada langkah sebelumnya dan memiliki nilai tertinggi pada kolomOBJ/SLAB.cat /sys/kernel/slab/<slab NAME>/reclaim_accountMisalnya, jalankan perintah berikut untuk menentukan apakah slab bernama
kmalloc-192memiliki memori yang ditandai sebagai dapat ditarik kembali.cat /sys/kernel/slab/kmalloc-192/reclaim_accountJika memori slab tidak dapat direklaim, 0 akan ditampilkan dalam keluaran perintah. Jika memori slab dapat direklaim, 1 akan ditampilkan dalam keluaran perintah.
Identifikasi penyebab tingginya persentase memori slab_unreclaimable.
Anda dapat menggunakan tool crash untuk analisis statis atau tool perf untuk analisis dinamis guna mengidentifikasi penyebab kebocoran memori slab. Pada skenario contoh dalam topik ini, slab bernama
kmalloc-192mengalami kebocoran memori.Metode 1: Gunakan crash untuk melakukan analisis statis
Jalankan perintah berikut untuk menginstal alat crash:
sudo yum install crash -yJalankan perintah berikut untuk menginstal alat kernel-debuginfo:
Alibaba Cloud Linux 3
sudo yum install -y kernel-debuginfo-<kernel version> --enablerepo=alinux3-plus-debugCatatanGanti
kernel versiondengan versi kernel aktual sistem. Jalankan perintahuname -runtuk mengetahui versi kernel.Alibaba Cloud Linux 2
sudo yum install kernel-debuginfo -y
Jalankan perintah berikut untuk memulai alat crash:
sudo crashJalankan perintah berikut di crash untuk melihat statistik memori tentang
kmalloc-192:kmem -S kmalloc-192Jika ada banyak data statistik memori, Anda dapat menentukan untuk hanya melihat beberapa baris terakhir. Sebagai contoh, Anda dapat menjalankan perintah berikut untuk melihat 10 baris terakhir data:
kmem -S kmalloc-192 | tail -n 10Contoh keluaran perintah:
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 0Output menunjukkan bahwa jumlah memori bebas (kolom
FREE) dariffff88028398a000kecil, sedangkan jumlah memori yang dialokasikan (kolomALLOCATED) besar.Jalankan perintah berikut di crash untuk melihat data memori tentang
ffff88028398a000:rd ffff88028398a000 512 -SJika keluaran perintah berisi sejumlah besar data, Anda dapat menampilkan keluaran perintah dalam halaman.
Misalnya, jika fungsi
put_cred_rcumuncul berulang kali dalam output, Anda dapat memeriksa kode sumber kernel Linux dan mencari fungsiput_cred_rcu.void __put_cred(struct cred *cred) { call_rcu(&cred->rcu, put_cred_rcu); }Fungsi
put_cred_rcudigunakan untuk melepaskan struct `cred` secara asinkron. Kehadiranput_cred_rcudi akhir struct `cred` menunjukkan adanya kebocoran memori slab di kernel.
Metode 2: Gunakan perf untuk melakukan analisis dinamis
Jalankan perintah berikut untuk menginstal alat perf:
sudo yum install perf -yJalankan perintah berikut untuk menggunakan perf guna mendapatkan secara dinamis memori yang tidak dilepaskan dalam
kmalloc-192dengan interval 200 detik:sudo perf record -a -e kmem:kmalloc --filter 'bytes_alloc == 192' -e kmem:kfree --filter ' ptr != 0' sleep 200Simpan data yang diperoleh secara dinamis ke file sementara di direktori saat ini.
Dalam contoh ini, file sementara diberi nama testperf.txt.
sudo perf script > testperf.txtJalankan perintah berikut untuk melihat isi dari testperf.txt:
cat testperf.txtAnda harus secara manual mengidentifikasi memori slab yang tidak memiliki memori bebas (
free), lalu mencari fungsi yang menyebabkan kebocoran memori slab dalam kode sumber kernel Linux.
Setelah Anda menggunakan alat seperti crash dan perf untuk menentukan jalur panggilan fungsi atau struktur data kernel yang terpengaruh terkait kebocoran memori, kami sarankan Anda mengidentifikasi sumber spesifik dari kebocoran memori di bawah bimbingan pengembang kernel atau personel O&M profesional, dan kemudian menyelesaikan masalah kebocoran memori.
Pertimbangkan solusi berikut:
Tingkatkan kernel atau tambalan.
Atur ulang parameter kernel.
Mulai ulang layanan atau modul yang terpengaruh.
Optimalkan aplikasi atau driver.
Mulai ulang sistem.
Referensi
Kebocoran memori slab mengurangi memori yang tersedia untuk aplikasi pada suatu instance dan menyebabkan memory fragmentation. Hal ini dapat memicu OOM Killer sistem serta menyebabkan fluktuasi performa sistem.