Redis: Menampilkan ukuran / ukuran database untuk kunci

91

Instance redis saya tampaknya tumbuh sangat besar dan saya ingin mencari tahu dari beberapa database yang saya miliki di sana yang menghabiskan berapa banyak memori. INFOPerintah Redis hanya menunjukkan ukuran total dan jumlah kunci per database yang tidak memberi saya banyak wawasan ... Jadi alat / ide apa pun yang memberi saya lebih banyak informasi saat memantau server redis akan dihargai.

Dokumentasi Redis tidak menunjukkan kepada saya perintah apa pun yang dapat mengembalikan memori yang dikonsumsi dari kunci tertentu, jadi saya kira jika ada kode buggy yang akan menulis banyak "sampah" untuk redis, ini akan sangat sulit ditemukan ...

Bernhard Vallant
sumber

Jawaban:

115

Jadi solusi saya untuk masalah saya sendiri: Setelah bermain-main dengan redis-clisedikit lebih lama, saya menemukan bahwa DEBUG OBJECT <key>mengungkapkan sesuatu seperti serializedlengthkunci, yang sebenarnya adalah sesuatu yang saya cari ...

Untuk seluruh database, Anda perlu menggabungkan semua nilai KEYS *yang seharusnya tidak terlalu sulit dengan bahasa skrip pilihan Anda ...

Hal buruknya adalah redis.io tidak memiliki banyak informasi tentang DEBUG OBJECT.

Bernhard Vallant
sumber
1
Apakah panjang serial adalah ukuran seluruh objek, dalam byte?
raffian
18
@BernhardVallant, terima kasih atas jawabannya. Saya melanjutkan dan menulis skrip cepat yang mencetak semua kunci dan ukurannya dalam format yang dapat dibaca manusia. Pikir saya akan berbagi. :) gist.github.com/epicserve/5699837
Brent O'Connor
13
Nilai dari serializedlength bukan tentang ukuran memori! Ini adalah ukuran yang akan diambil objek saat menyimpan ke file RDB di disk. Periksa kode sumber: github.com/antirez/redis/blob/… dan github.com/antirez/redis/blob/…
Hugo Tavares
tampaknya tidak ada cara untuk mendapatkan ukuran kunci atau nilai atau nilai kunci dalam memori (Bukan ukuran yang dibuang ke disk)
Avner Barr
4
FYI: jangan repot-repot mencoba apa pun dengan DEBUG di AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Bahkan ditemukan redis-cli --bigkeys akan macet
sonjz
41

MEMORY USAGE key perintah memberi Anda jumlah byte yang dibutuhkan kunci dan nilainya untuk disimpan dalam RAM.

Penggunaan yang dilaporkan adalah total alokasi memori untuk data dan biaya administrasi yang diperlukan oleh nilai kunci (dokumentasi redis sumber)

dogfish
sumber
13
ini hanya dapat digunakan versi> 4.0
teik
15

Lihatlah proyek ini, ia mengeluarkan beberapa statistik menarik tentang ruang kunci berdasarkan regex dan prefiks. Ini menggunakan DEBUG OBJECTperintah dan memindai db, mengidentifikasi kelompok kunci dan memperkirakan persentase ruang yang mereka gunakan .

https://github.com/snmaynard/redis-audit

Outputnya terlihat seperti ini:

Summary  

---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
Key                                                | Memory Usage | Expiry Proportion | Last Access Time                                    
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
notification_3109439                               | 88.14%       | 0.0%              | 2 minutes                               
user_profile_3897016                               | 11.86%       | 99.98%            | 20 seconds  
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  

Atau yang ini: https://github.com/sripathikrishnan/redis-rdb-tools yang melakukan analisis penuh pada seluruh ruang kunci dengan menganalisis file dump.rdb secara offline. Yang ini juga bekerja dengan baik. Ini dapat memberi Anda ukuran avg / min / max untuk entri di db Anda, dan bahkan akan melakukannya berdasarkan awalan.

jumand
sumber
8

Anda mungkin merasa sangat berguna untuk mengambil sampel kunci Redis dan mengelompokkannya berdasarkan jenis. Salvatore telah menulis alat yang disebut redis-sampler yang mengeluarkan sekitar 10.000 RANDOMKEYperintah diikuti oleh TYPEtombol yang diambil. Dalam hitungan detik, atau menit, Anda akan mendapatkan gambaran yang cukup akurat tentang distribusi jenis kunci.

Saya telah menulis ekstensi (sayangnya tidak di mana pun open-source karena itu terkait dengan pekerjaan), yang menambahkan sedikit introspeksi nama kunci melalui regex yang memberi Anda gambaran tentang jenis kunci aplikasi apa (sesuai dengan struktur penamaan apa pun yang Anda menggunakan), disimpan di Redis. Dikombinasikan dengan keluaran redis-sampler yang lebih umum, ini akan memberi Anda gambaran yang sangat bagus tentang apa yang terjadi.

rlotun
sumber
7
Tks, sebenarnya membantu saya lebih dariredis-cli --bigkeys
nmat
4

Mungkin Anda bisa melakukan introspeksi pada file db. Protokolnya relatif sederhana (namun tidak terdokumentasi dengan baik), jadi Anda dapat menulis parser untuk menentukan kunci individual mana yang menghabiskan banyak ruang.


Saran baru:

Sudahkah Anda mencoba menggunakan MONITORuntuk melihat apa yang sedang ditulis, secara langsung? Mungkin Anda dapat menemukan masalah dengan data yang sedang bergerak.

Donald Miner
sumber
Tampaknya menarik, tetapi saya mencoba menemukan cara mudah untuk memantau konsumsi memori redis di server ... Memeriksa dump tampaknya lebih praktis untuk debugging bagi saya, tidak juga menyebutkan bahwa dump itu sedikit pertunjukan sekarang!
Bernhard Vallant
Anda harus bertanya ke milis redis. Saya sangat tertarik mendengar jawaban "terbaik" untuk ini.
Donald Miner
Kami sudah mencoba INFOdan MONITOR, tetapi mungkin masalah utamanya adalah, bahwa ketika tidak menonton redis tumbuh sangat besar ...
Bernhard Vallant
Ok saya mempostingnya ke milis mereka, tetapi menemukan jawaban sendiri juga ... Lihat di bawah!
Bernhard Vallant
kembali. introspeksi pada file db - Saya menulis skrip untuk mengurai file dump.rdb dan mengeluarkan file csv yang melaporkan perkiraan memori yang digunakan oleh setiap kunci. Lihat github.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan
2

Saya biasanya lebih suka metode pengambilan sampel kunci untuk memecahkan masalah skenario seperti itu.

redis-cli -p 6379 -n db_number --bigkeys

Misalnya:-

redis-cli -p 6370 -n 0 --bigkeys

anrajme
sumber
Mengapa ini disebut metode "pengambilan sampel kunci"? Saya merasa sangat terbatas karena hanya menunjukkan puncak gunung es.
MrR
0

Bagaimana kalau redis-cli dapatkan KEYNAME | wc -c

Ed Greenberg
sumber