全部产品
Search
文档中心

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

更新时间:Jan 06, 2026

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

Deskripsi masalah

Layanan yang dideploy pada suatu instans kadang-kadang mengalami waktu respons yang lama atau waktu pemanggilan sistem (system call) yang lama. Saat hal ini terjadi, metrik sys sistem meningkat, dan buddy system kekurangan memori orde tinggi (memori dengan order lebih besar dari 3). Sebagai contoh, output berikut dikembalikan ketika Anda menjalankan perintah cat /proc/buddyinfo. Mulai dari kolom keempat, setiap kolom merepresentasikan memori bebas untuk order yang berbeda dalam buddy system.

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

Setelah sistem Linux berjalan dalam waktu lama, blok-blok memori fisik kontigu berukuran besar terpecah menjadi blok-blok yang lebih kecil. Jika suatu layanan yang dideploy pada sistem meminta blok memori kontigu berukuran besar, sistem akan memulai proses kompaksi memori yang memakan waktu. Hal ini dapat menyebabkan fluktuasi performa. Saat fragmentasi memori terjadi, informasi stack kernel biasanya mirip dengan contoh berikut.

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

untuk mengatasi fragmentasi memori di Linux, Anda dapat mengambil langkah-langkah berikut:

  • Menyesuaikan min watermark

    Anda dapat mengatur min watermark menjadi 1% hingga 3% dari total memori. Nilai 2% direkomendasikan. Pengaturan ini memicu reclaim asinkron lebih awal saat sumber daya memori rendah. Jalankan perintah berikut untuk menyesuaikan min watermark:

    sysctl -w vm.min_free_kbytes = memtotal_kbytes * 2%

    Dalam perintah ini, variabel memtotal_kbytes * 2% merepresentasikan 2% dari total memori instans.

  • Menyesuaikan selisih antara min watermark dan low watermark

    Anda dapat menyesuaikan selisih antara min watermark dan low watermark menggunakan parameter kernel watermark_scale_factor. Hal ini membantu mengelola permintaan memori mendadak dari layanan. Nilai default watermark_scale_factor adalah 0,1% dari total memori. Nilai minimum, yaitu selisih terkecil yang mungkin antara min watermark dan low watermark, adalah 0.5*min watermark. Jalankan perintah berikut untuk menyesuaikan watermark_scale_factor:

    sysctl -w vm.watermark_scale_factor = value

    Dalam perintah ini, variabel value adalah selisih yang Anda tetapkan antara min watermark dan low watermark.

  • Menjalankan kompaksi memori secara berkala

    Selama jam sepi, Anda dapat memicu kompaksi memori asinkron secara manual. Jalankan perintah berikut untuk memicu proses tersebut:

    echo 1 > /proc/sys/vm/compact_memory
  • Melepaskan cache secara manual secara berkala

    Jika langkah-langkah sebelumnya tidak menyelesaikan fragmentasi memori, Anda juga dapat melepaskan cache (drop cache) selama jam sepi. Memori kemudian dialokasikan ulang. Melepaskan cache merupakan cara efektif untuk mencegah fragmentasi memori. Namun, operasi ini dapat menyebabkan fluktuasi performa sistem yang singkat. Jalankan perintah berikut untuk melepaskan cache secara manual:

    echo 3 > /proc/sys/vm/drop_caches