Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk membersihkan serpihan memori Redis

Bagaimana untuk membersihkan serpihan memori Redis

WBOY
WBOYke hadapan
2023-05-26 13:18:331359semak imbas

Apakah itu pemecahan memori Redis?

Jumlah jumlah ruang yang tinggal dalam sistem pengendalian adalah mencukupi, tetapi apabila memohon ruang dengan alamat berterusan N bait, tiada ruang berterusan N bait dalam ruang memori yang tinggal, maka baki yang tinggal ruang ingatan kurang daripada N Ruang ingatan bersebelahan bait ialah pemecahan memori.

Bagaimanakah pemecahan memori Redis terbentuk?

Terdapat sebab dalaman dan luaran untuk pembentukan pemecahan memori:

  • Sebab dalaman: Strategi peruntukan pengalokasi memori menentukan bahawa sistem pengendalian tidak dapat mencapai "pada -peruntukan permintaan".

    • Redis menggunakan libc, jemalloc dan tcmalloc untuk memperuntukkan memori Secara lalai, jemalloc digunakan.

    • Pengagih memori memperuntukkan ruang memori mengikut saiz tetap, tidak sepenuhnya mengikut saiz memori yang diminta oleh aplikasi.

    • Mengambil jemalloc sebagai contoh, ia membahagikan ruang memori mengikut satu siri saiz tetap, seperti 8 bait, 16 bait, 32 bait,..., 2KB, 4KB, dll. Jemalloc akan memperuntukkan ruang saiz tetap yang paling hampir dengan memori yang diminta oleh program.

  • Sebab luaran: Pasangan nilai kunci mempunyai saiz yang berbeza dan pasangan nilai kunci boleh diubah suai dan dipadamkan.

    • Apabila Redis memohon untuk peruntukan ruang memori, untuk keperluan ruang memori saiz yang berbeza, pengalokasi memori memperuntukkan ruang memori mengikut saiz tetap, dan ruang memori yang diperuntukkan secara amnya adalah lebih besar daripada ruang memori yang diminta Ruang memori lebih besar, yang akan menghasilkan pemecahan memori tertentu.

    • Pasangan nilai kunci akan diubah suai dan dipadamkan, yang akan membawa kepada pengembangan dan pelepasan ruang.

Bagaimana untuk menentukan sama ada Redis mempunyai pemecahan memori?

DAS menanyakan maklumat terperinci penggunaan memori melalui arahan INFO yang disediakan oleh Redis Perintahnya adalah seperti berikut:

INFO memory
# Memory
used_memory:350458970752
used_memory_human:326.39G
used_memory_rss:349066919936
used_memory_rss_human:325.09G
…
mem_fragmentation_ratio:1.00
  • used_memory: Menunjukkan. bahawa Redis digunakan untuk menyimpan data Ruang memori sebenar yang diminta.

  • used_memory_rss: Menunjukkan ruang memori fizikal yang sebenarnya diperuntukkan oleh sistem pengendalian kepada Redis, yang termasuk serpihan ruang memori.

  • mem_fragmentation_ratio merujuk kepada kadar pemecahan memori semasa Redis. Formula pengiraan: mem_fragmentation_ratio=used_memory_rss/used_memory

    • mem_fragmentation_ratio lebih besar daripada atau sama dengan 1 tetapi kurang daripada atau sama dengan 1.5.

    • nisbah_pecah_mem lebih besar daripada 1.5, menunjukkan bahawa kadar pemecahan memori telah melebihi 50%.

Bagaimana untuk membersihkan serpihan memori?

Kaedah "mudah dan kasar" adalah untuk memulakan semula tika Redis. Tetapi kaedah ini akan membawa dua akibat:

  • Jika data dalam Redis tidak berterusan, data akan hilang; Redis data Sama ada ia berterusan atau tidak, kaedah AOF atau RDB perlu digunakan untuk memulihkan data, dan masa pemulihan bergantung pada saiz fail AOF atau RDB. Dan jika terdapat hanya satu contoh Redis, perkhidmatan tidak boleh disediakan semasa fasa pemulihan.

  • Adakah terdapat cara yang lebih baik? Ya, dari versi 4.0-RC3 dan seterusnya, Redis sendiri menyediakan kaedah untuk membersihkan serpihan memori secara automatik.

  • Pembersihan serpihan memori secara automatik

Pembersihan pecahan memori, dalam istilah mudah, bermaksud "bergerak untuk memberi laluan dan menggabungkan ruang".

Apabila terdapat data yang membahagikan ruang memori berterusan kepada beberapa ruang terputus, sistem pengendalian akan menyalin data ke tempat lain, dan ruang ingatan terputus asal menjadi ruang ingatan berterusan .

Tetapi defragmentasi memerlukan kos. Memindahkan berbilang salinan data ke lokasi baharu dan mengosongkan ruang asal adalah sesuatu yang mesti dilakukan oleh sistem pengendalian, tetapi proses ini memerlukan masa. Di samping itu, apabila data disalin, Redis akan disekat dan prestasi akan dikurangkan.

Bagaimana untuk mengurangkan masalah ini?

Redis secara khusus menyediakan tetapan parameter untuk mekanisme pembersihan pemecahan memori automatik. Anda boleh menetapkan parameter untuk mengawal masa mula dan tamat pembersihan pemecahan, serta perkadaran CPU yang diduduki, dengan itu mengurangkan kesan prestasi pembersihan pemecahan pada pemprosesan permintaan Redis.

Pertama, hidupkan pembersihan pemecahan memori automatik:

set konfigurasi activedefrag ya

Kemudian, tetapkan syarat untuk mencetuskan pembersihan memori:


active- defrag-ignore-bait 100mb: Menunjukkan bahawa apabila bilangan bait pemecahan memori mencapai 100MB, pembersihan akan bermula; ruang pemecahan memori menduduki peruntukan sistem pengendalian Apabila jumlah ruang yang diperuntukkan kepada Redis mencapai 10%, pembersihan bermula.

  • Akhir sekali, kawal had atas dan bawah perkadaran masa CPU yang diduduki oleh operasi pembersihan:

  • active-defrag-cycle-min 25: Menunjukkan pembersihan automatik Perkadaran masa CPU yang digunakan dalam proses adalah tidak kurang daripada 25% untuk memastikan pembersihan dapat diteruskan seperti biasa; Menunjukkan bahawa perkadaran masa CPU yang digunakan dalam proses pembersihan automatik adalah tidak tinggi Di atas 75%, apabila melebihi, pembersihan akan dihentikan untuk mengelakkan sejumlah besar salinan memori menyekat Redis semasa pembersihan, mengakibatkan peningkatan kependaman tindak balas.

Atas ialah kandungan terperinci Bagaimana untuk membersihkan serpihan memori Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam