Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Linux:Mitigate Linux memory fragmentation

Son Güncelleme:Oct 08, 2026

Uzun süre çalışan Linux sistemlerinde, yüksek sıralı tahsisler sırasında performans dalgalanmalarına neden olan bellek parçalanması gelişebilir. Parçalanmayı proaktif olarak azaltmak için aşağıdaki yöntemleri kullanın.

Belirtiler

Örnek üzerindeki hizmetlerde aralıklı uzun yanıt süreleri veya sistem çağrısı gecikme süresi artışları yaşanır. sys CPU kullanımı artar. Buddy sistemi, yüksek sıralı bellekte (order > 3 olan bloklar) kıtlık gösterir. Kontrol etmek için cat /proc/buddyinfo komutunu çalıştırın; dördüncü sütundan başlayarak her sütun, ilgili order için boş sayfa sayısını gösterir:

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

Neden

Zamanla, büyük bitişik fiziksel bellek blokları daha küçük, bitişik olmayan bloklara parçalanır. Bir hizmet büyük bir bitişik tahsis istediğinde, çekirdek bellek sıkıştırma işlemini tetikler; bu yavaş bir süreçtir ve performans dalgalanmalarına neden olur. Tipik bir parçalanma kaynaklı çekirdek yığın izlemesi:

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])

Çözümler

Bellek parçalanmasını azaltmak için aşağıdaki yöntemleri kullanın:

  • Minimum su işaretini ayarlayın

    Minimum su işaretini toplam belleğin %1–%3'üne (%2 önerilir) ayarlayın. Bu, boş bellek düşük olduğunda eşzamansız geri alım işleminin daha erken tetiklenmesini sağlar. Çalıştırın:

    sysctl -w vm.min_free_kbytes = memtotal_kbytes * 2%

    memtotal_kbytes * 2% ifadesini, örneğinizin toplam belleğinin KB cinsinden %2'siyle değiştirin.

  • Minimum ve düşük su işaretleri arasındaki farkı ayarlayın

    watermark_scale_factor çekirdek parametresi, minimum ve düşük su işaretleri arasındaki farkı kontrol ederek ani tahsisleri absorbe etmeye yardımcı olur. Varsayılan fark: toplam belleğin %0,1'i; minimum: minimum su işaretinin yarısı. watermark_scale_factor değerini ayarlamak için çalıştırın:

    sysctl -w vm.watermark_scale_factor = value

    value değeri, min watermark ile low watermark arasındaki farkı ayarlayan bir ölçek faktörüdür.

  • Bellek sıkıştırma işlemini periyodik olarak gerçekleştirin

    Yoğunluğun düşük olduğu saatlerde, eşzamansız memory compaction işlemini manuel olarak tetikleyin:

    echo 1 > /proc/sys/vm/compact_memory
  • Önbelleği periyodik olarak temizleyin

    Önceki yöntemler yetersiz kalırsa, planlı bir bakım penceresi sırasında önbelleği temizleyin. Bu işlem, bellek sayfalarını yeniden tahsis için serbest bırakır ve parçalanmayı etkili bir şekilde azaltır, ancak geçici performans dalgalanmalarına neden olur. Çalıştırın:

    echo 3 > /proc/sys/vm/drop_caches