Menghindari swap di ElastiCache Redis

14

Kami telah mengalami masalah berkelanjutan dengan bertukar instance ElastiCache Redis kami. Amazon tampaknya memiliki beberapa pemantauan internal mentah di tempat yang pemberitahuan menukar lonjakan penggunaan dan hanya me-restart instance ElastiCache (sehingga kehilangan semua item cache kami). Berikut grafik BytesUsedForCache (garis biru) dan SwapUsage (garis oranye) pada instance ElastiCache kami selama 14 hari terakhir:

Redis ElastiCache BytesUsedForCache dan Swap

Anda dapat melihat pola meningkatnya penggunaan swap yang tampaknya memicu reboot instance ElastiCache kami, di mana kami kehilangan semua item yang di-cache kami (BytesUsedForCache turun ke 0).

Tab 'Acara Cache' di dasbor ElastiCache kami memiliki entri yang sesuai:

ID Sumber | Ketik | Tanggal | Peristiwa

cache-instance-id | cache-cluster | Sel 22 Sep 07:34:47 GMT-400 2015 | Cache node 0001 dimulai kembali

cache-instance-id | cache-cluster | Sel 22 Sep 07:34:42 GMT-400 2015 | Kesalahan me-restart mesin cache pada node 0001

cache-instance-id | cache-cluster | Minggu, 20 Sep 11:13:05 GMT-400 2015 | Cache node 0001 dimulai kembali

cache-instance-id | cache-cluster | Kamis 17 Sep 22:59:50 GMT-400 2015 | Cache node 0001 dimulai kembali

cache-instance-id | cache-cluster | Rabu 16 Sep 10:36:52 GMT-400 2015 | Cache node 0001 dimulai kembali

cache-instance-id | cache-cluster | Sel 15 Sep 2011 05:02 GMT-400 2015 | Cache node 0001 dimulai kembali

(snip entri sebelumnya)

Klaim Amazon :

SwapUsage - dalam penggunaan normal, baik Memcached maupun Redis tidak harus melakukan swap

Pengaturan kami yang relevan (tidak standar):

  • Jenis contoh: cache.r3.2xlarge
  • maxmemory-policy: allkeys-lru (kami telah menggunakan default volatile-lru sebelumnya tanpa banyak perbedaan)
  • maxmemory-samples: 10
  • reserved-memory: 2500000000
  • Memeriksa perintah INFO pada instance, saya melihat mem_fragmentation_ratioantara 1,00 dan 1,05

Kami telah menghubungi dukungan AWS dan tidak mendapatkan banyak saran yang berguna: mereka menyarankan agar memori yang dicadangkan lebih tinggi (standarnya adalah 0, dan kami memiliki cadangan 2,5 GB). Kami tidak memiliki replikasi atau snapshot yang disiapkan untuk instance cache ini, jadi saya percaya tidak ada BGSAVE yang seharusnya terjadi dan menyebabkan penggunaan memori tambahan.

The maxmemorycap dari cache.r3.2xlarge adalah 62495129600 byte, dan meskipun kita memukul topi kami (minus kami reserved-memory) cepat, tampaknya aneh bagi saya bahwa sistem operasi host akan merasa tertekan untuk menggunakan begitu banyak Swap di sini, dan begitu cepat, kecuali Amazon telah menghidupkan pengaturan swappiness OS untuk beberapa alasan. Adakah ide mengapa kita menyebabkan begitu banyak penggunaan swap pada ElastiCache / Redis, atau solusi yang dapat kita coba?

Josh Kupershmidt
sumber

Jawaban:

7

Karena tidak ada orang lain yang punya jawaban di sini, saya pikir saya akan membagikan satu-satunya hal yang berhasil bagi kami. Pertama, ide-ide ini tidak berhasil:

  • jenis instance cache yang lebih besar: mengalami masalah yang sama pada instance yang lebih kecil dari cache.r3.2xlarge yang kami gunakan sekarang
  • tweaker maxmemory-policy: volatile-lru atau allkey-lru tampaknya tidak membuat perbedaan
  • menabrak maxmemory-samples
  • menabrak reserved-memory
  • memaksa semua klien untuk menetapkan waktu kedaluwarsa, umumnya paling banyak 24 jam dengan beberapa penelepon langka yang memungkinkan hingga 7 hari, tetapi sebagian besar penelepon menggunakan waktu kedaluwarsa 1-6 jam.

Inilah yang akhirnya membantu, banyak: menjalankan pekerjaan setiap dua belas jam yang menjalankan SCAN atas semua kunci dalam potongan ( COUNT) dari 10.000. Berikut ini adalah BytesUsedForCache dari instance yang sama, masih instance cache.r3.2xlarge dalam penggunaan yang lebih berat dari sebelumnya, dengan pengaturan yang sama seperti sebelumnya:

BytesUsedForCache

Penurunan gigi gergaji dalam penggunaan memori sesuai dengan waktu tugas cron. Selama periode dua minggu ini, penggunaan swap kami telah mencapai ~ 45 MB (ditutup pada ~ 5 GB sebelum memulai kembali sebelumnya). Dan tab Cache Events di ElastiCache melaporkan tidak ada lagi Cache Restart events.

Ya, ini seperti lumpur yang tidak harus dilakukan sendiri oleh pengguna, dan bahwa Redis harus cukup pintar untuk menangani pembersihan ini sendiri. Jadi mengapa ini berhasil? Ya, Redis tidak melakukan banyak atau pembersihan awal dari kunci yang sudah kadaluwarsa, sebaliknya mengandalkan penggusuran kunci yang sudah kadaluarsa selama GET . Atau, jika Redis menyadari memori penuh, maka itu akan mulai mengusir kunci untuk setiap SET baru, tetapi teori saya adalah bahwa pada saat itu Redis sudah disemprot.

Josh Kupershmidt
sumber
Josh, hanya ingin tahu apakah Anda memiliki kemajuan dalam mengatasi masalah ini? Kami mengalami situasi yang sama. Apakah Anda masih menggunakan solusi yang sama seperti sebelumnya?
Andrew C
@AndrewC kita masih memiliki contoh cache yang sama ini berkeliaran, dengan perilaku gigi gergaji yang sama dari SCAN, dan hanya beberapa lonjakan penggunaan swap yang bertahan dalam 3 bulan terakhir - jauh dari buruk seperti yang saya posting dalam pertanyaan, terutama karena pembongkaran aktivitas jauh dari contoh ini, dan SCANpekerjaan dalam jawabannya masih memprovokasi pembersihan. AWS sekarang menawarkan fitur Redis Cluster yang saya yakin akan membantu untuk penggunaan berat.
Josh Kupershmidt
senang mendengarnya; kami mengambil pendekatan yang mirip dengan membongkar muatan cache ke cache terpisah. Apa hipotesis Anda tentang bagaimana pengelompokan akan membantu mengurangi penggunaan swap? Hanya dengan mengurangi beban keseluruhan?
Andrew C
@JoshKupershmidt pahlawan saya Anda.
Moriarty
1

Saya tahu ini mungkin sudah tua tetapi saya menemukan ini di dokumentasi aws.

https://aws.amazon.com/elasticache/pricing/ Mereka menyatakan bahwa r3.2xlarge memiliki memori 58,2gb.

https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/ParameterGroups.Redis.html Mereka menyatakan bahwa maxmemory sistem adalah 62gb (ini adalah saat kebijakan maxmemory masuk) dan tidak dapat diubah . Tampaknya apa pun yang terjadi dengan Redis di AWS kami akan bertukar ..

tlindhardt
sumber
AWS benar - mereka mengatakan maxmemory adalah 62495129600byte, tepatnya 58.2 GiB. The halaman harga Anda terhubung memiliki memori dalam satuan GiB, bukan GB. The maxmemoryparameter mungkin tidak dimodifikasi karena ada tombol-tombol yang lebih baik yang disediakan oleh Redis, seperti reserved-memory(meskipun salah satu yang tidak membantu saya ...), yang dimodifikasi, dan AWS tidak ingin Anda misconfiguring node dengan misalnya mengatakan Redis ke menggunakan lebih banyak memori daripada yang dimiliki oleh Elasticache VM.
Josh Kupershmidt