全部产品
Search
文档中心

Alibaba Cloud Linux:Apa yang harus saya lakukan jika sebuah instance memiliki persentase memori slab_unreclaimable yang tinggi?

更新时间:Dec 09, 2025

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

  1. Hubungkan ke instance Linux untuk pemecahan masalah.

    Untuk informasi lebih lanjut, lihat Metode untuk menghubungkan ke Instance ECS.

  2. Periksa nama slab yang memiliki jumlah objects terbanyak atau jumlah memori terbesar yang tidak dapat ditarik kembali:

    1. Lihat informasi tentang slab yang memiliki jumlah objects terbanyak atau jumlah memori terbesar.

      slabtop -s -a

      Pada output perintah, catat nama slab (nilai pada kolom NAME) yang memiliki nilai tertinggi pada kolom OBJ/SLAB.

    2. 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 kolom OBJ/SLAB.

      cat /sys/kernel/slab/<slab NAME>/reclaim_account

      Misalnya, jalankan perintah berikut untuk menentukan apakah slab bernama kmalloc-192 memiliki memori yang ditandai sebagai dapat ditarik kembali.

      cat /sys/kernel/slab/kmalloc-192/reclaim_account

      Jika memori slab tidak dapat direklaim, 0 akan ditampilkan dalam keluaran perintah. Jika memori slab dapat direklaim, 1 akan ditampilkan dalam keluaran perintah.

  3. 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-192 mengalami kebocoran memori.

    Metode 1: Gunakan crash untuk melakukan analisis statis

    1. Jalankan perintah berikut untuk menginstal alat crash:

      sudo yum install crash -y
    2. Jalankan perintah berikut untuk menginstal alat kernel-debuginfo:

      • Alibaba Cloud Linux 3

        sudo yum install -y kernel-debuginfo-<kernel version> --enablerepo=alinux3-plus-debug
        Catatan

        Ganti kernel version dengan versi kernel aktual sistem. Jalankan perintah uname -r untuk mengetahui versi kernel.

      • Alibaba Cloud Linux 2

        sudo yum install kernel-debuginfo -y
    3. Jalankan perintah berikut untuk memulai alat crash:

      sudo crash
    4. Jalankan perintah berikut di crash untuk melihat statistik memori tentang kmalloc-192:

      kmem -S kmalloc-192

      Jika 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 10

      Contoh 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     0

      Output menunjukkan bahwa jumlah memori bebas (kolom FREE) dari ffff88028398a000 kecil, sedangkan jumlah memori yang dialokasikan (kolom ALLOCATED) besar.

    5. Jalankan perintah berikut di crash untuk melihat data memori tentang ffff88028398a000:

      rd ffff88028398a000 512 -S

      Jika keluaran perintah berisi sejumlah besar data, Anda dapat menampilkan keluaran perintah dalam halaman.

      Misalnya, jika fungsi put_cred_rcu muncul berulang kali dalam output, Anda dapat memeriksa kode sumber kernel Linux dan mencari fungsi put_cred_rcu.

      void __put_cred(struct cred *cred)
      {
          call_rcu(&cred->rcu, put_cred_rcu);
      }

      Fungsi put_cred_rcu digunakan untuk melepaskan struct `cred` secara asinkron. Kehadiran put_cred_rcu di akhir struct `cred` menunjukkan adanya kebocoran memori slab di kernel.

    Metode 2: Gunakan perf untuk melakukan analisis dinamis

    1. Jalankan perintah berikut untuk menginstal alat perf:

      sudo yum install perf -y
    2. Jalankan perintah berikut untuk menggunakan perf guna mendapatkan secara dinamis memori yang tidak dilepaskan dalam kmalloc-192 dengan interval 200 detik:

      sudo perf record -a -e kmem:kmalloc --filter 'bytes_alloc == 192' -e kmem:kfree --filter ' ptr != 0' sleep 200
    3. Simpan 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.txt
    4. Jalankan perintah berikut untuk melihat isi dari testperf.txt:

      cat testperf.txt

      Anda 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.

  4. 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.