全部产品
Search
文档中心

Alibaba Cloud Linux:Solusi untuk fragmentasi memori di sistem operasi Linux

更新时间:Jun 28, 2025

Ketika sistem operasi Linux menyala dalam waktu lama, fragmentasi memori dapat terjadi. Topik ini memberikan solusi untuk masalah tersebut.

Deskripsi masalah

Ketika layanan pada suatu instance sesekali membutuhkan waktu lama untuk merespons atau pemanggilan sistem memerlukan waktu lebih lama, nilai sys dari metrik sistem meningkat. Sistem buddy kekurangan memori orde tinggi (memori dengan order lebih tinggi dari 3). Berikut adalah contoh keluaran dari perintah cat /proc/buddyinfo. Setiap kolom mulai dari kolom keempat menunjukkan memori bebas pada order yang berbeda dalam sistem buddy.
cat /proc/buddyinfo 
Node 0, zone      DMA      1      0      0   1   2    1    1     0     1      1     3 
Node 0, zone    DMA32   3173    856    529   0   0    0    0     0     0      0     0 
Node 0, zone   Normal  19030   8688   7823   0   0    0    0     0     0      0     0

Penyebab potensial

Ketika sistem operasi Linux menyala dalam waktu lama, blok memori fisik besar yang berdekatan terpecah menjadi blok memori fisik kecil. Jika suatu layanan memerlukan blok memori besar yang berdekatan, sistem akan memulai prosedur kompaksi memori yang memakan waktu dan dapat menyebabkan gangguan performa. Fragmentasi memori sering kali menghasilkan informasi stack kernel. Berikut adalah contoh informasi stack kernel:
0xffffffff8118f9cb compaction_alloc  ([kernel.kallsyms])
0xffffffff811c88a9 migrate_pages  ([kernel.kallsyms])
0xffffffff811901ee compact_zone  ([kernel.kallsyms])
0xffffffff8119041b compact_zone_order  ([kernel.kallsyms])
0xffffffff81190735 try_to_compact_pages  ([kernel.kallsyms])
0xffffffff81631cb4 __alloc_pages_direct_compact  ([kernel.kallsyms])
0xffffffff811741d5 __alloc_pages_nodemask  ([kernel.kallsyms])
0xffffffff811b5a79 alloc_pages_current  ([kernel.kallsyms])
0xffffffff811c0005 new_slab  ([kernel.kallsyms])
0xffffffff81633848 __slab_alloc  ([kernel.kallsyms])
0xffffffff811c5291 __kmalloc_node_track_caller  ([kernel.kallsyms])
0xffffffff8151a8c1 __kmalloc_reserve.isra.30  ([kernel.kallsyms])
0xffffffff8151b7cd alloc_sib  ([kernel.kallsyms])
0xffffffff815779e9 sk_stream_alloc_skb  ([kernel.kallsyms])
0xffffffff8157872d tcp_sendmsg  ([kernel.kallsyms])
0xffffffff815a26b4 inet_sendmsg  ([kernel.kallsyms])
0xffffffff81511017 sock_aio_write  ([kernel.kallsyms])
0xffffffff811df729 do_sync_readv_writev  ([kernel.kallsyms])
0xffffffff811e0cfe do_readv_writev  ([kernel.kallsyms])

Solusi

Anda dapat mengambil salah satu langkah berikut untuk menangani fragmentasi memori di sistem operasi Linux:
  • Menyesuaikan Watermark Minimum
    Dalam sebagian besar kasus, disarankan untuk mengatur watermark minimum menjadi 1% hingga 3% dari total memori. Kami merekomendasikan pengaturan sebesar 2% dari total memori. Ketika sumber daya memori tidak mencukupi, reclaim asinkron dipicu. Anda dapat menjalankan perintah berikut untuk menyesuaikan watermark minimum:
    sysctl -w vm.min_free_kbytes = memtotal_kbytes * 2%
    Dalam perintah tersebut, variabel memtotal_kbytes * 2% menunjukkan ukuran memori setara dengan 2% dari total memori instance.
  • Menyesuaikan Perbedaan antara Watermark Minimum dan Rendah
    Anda dapat menentukan parameter kernel watermark_scale_factor untuk menyesuaikan perbedaan antara watermark minimum dan rendah guna menghadapi permintaan memori mendadak. Nilai default dari watermark_scale_factor adalah 0,1% dari total memori, dan nilai minimum dihitung menggunakan rumus berikut: 0,5 × <min watermark>. Nilai minimum ini adalah perbedaan minimum antara watermark minimum dan rendah. Anda dapat menjalankan perintah berikut untuk menyesuaikan nilai watermark_scale_factor:
    sysctl -w vm.watermark_scale_factor = value
    Dalam perintah tersebut, variabel value menunjukkan perbedaan yang ditentukan antara watermark minimum dan rendah.
  • Melakukan Kompaksi Memori secara Berkala
    Anda dapat menjalankan perintah berikut untuk memicu kompaksi memori asinkron selama jam-jam sepi:
    echo 1 > /proc/sys/vm/compact_memory
  • Menghapus Cache secara Manual pada Interval Tertentu
    Jika langkah-langkah sebelumnya tidak dapat menangani fragmentasi memori secara efektif, Anda juga dapat menghapus cache selama jam-jam sepi agar memori dapat dialokasikan ulang. Menghapus cache dapat mencegah fragmentasi memori secara efektif, namun gangguan performa jangka pendek mungkin terjadi saat operasi ini dilakukan. Anda dapat menjalankan perintah berikut untuk menghapus cache:
    echo 3 > /proc/sys/vm/drop_caches