日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Linux內存碎片化的應對措施

Linux系統長時間運行會出現內存碎片化的問題,本文主要提供了應對該問題的一些措施。

問題現象

實例內部署的業務偶然出現響應時間過長或者系統調用時間過長,系統的sys指標也會相應的增高,伙伴系統會缺少高階內存(order大于3的內存)。例如,運行cat /proc/buddyinfo命令的返回結果如下所示,其中從第4列開始,每一列對應伙伴系統的不同order空閑內存。

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

可能原因

Linux系統在長時間運行后,連續的大塊物理內存會被分解為小塊的物理內存。此時,系統中部署的業務如果需要連續的大塊內存,則系統會先進入耗時較長的內存規整流程,進而會引起系統性能抖動。一般情況下,內存碎片化會產生類似于如下所示的內核堆棧信息。

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

解決方案

應對Linux內存碎片化,您可以采取如下措施:

  • 調整min水位線

    多數情況下阿里云建議您將min水位線設置為總內存的1%~3%。推薦您設置為總內存的2%,當內存資源緊張時,提前進入異步回收。調整min水位線的命令如下:

    sysctl -w vm.min_free_kbytes = memtotal_kbytes * 2%

    其中,變量memtotal_kbytes * 2%表示當前實例內總內存的2%對應的內存大小。

  • 調整min水位線和low水位線之間的差值

    您可以通過內核的watermark_scale_factor調整min水位線和low水位線之間的差值,以應對業務突發申請內存的情況。watermark_scale_factor的默認值為總內存的0.1%,最小值(即min水位線和low水位線之間的最小差值)為0.5*min水位線。調整watermark_scale_factor的命令如下:

    sysctl -w vm.watermark_scale_factor = value

    其中,變量value為您手動設置的min水位線和low水位線之間的差值。

  • 定期進行內存規整

    您可以在業務空閑時段,主動觸發異步內存規整。觸發命令如下:

    echo 1 > /proc/sys/vm/compact_memory
  • 定期手動釋放緩存

    以上措施均不能有效應對內存碎片化時,您還可以在業務空閑時段執行釋放緩存(drop cache)的操作,然后內存會重新分配。釋放緩存是避免內存碎片化的有效措施,但在執行釋放緩存時會出現短時間的系統性能抖動。手動釋放緩存的命令如下:

    echo 3 > /proc/sys/vm/drop_caches