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 0Penyebab 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 defaultwatermark_scale_factoradalah 0,1% dari total memori. Nilai minimum, yaitu selisih terkecil yang mungkin antara min watermark dan low watermark, adalah0.5*min watermark. Jalankan perintah berikut untuk menyesuaikanwatermark_scale_factor:sysctl -w vm.watermark_scale_factor = valueDalam 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_memoryMelepaskan 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