Redis: Pokaż rozmiar / rozmiar bazy danych dla kluczy

88

Wydaje się, że moja instancja redis staje się bardzo duża i chciałbym dowiedzieć się, która z wielu baz danych, które tam mam, zużywa, ile pamięci. INFOPolecenie Redis pokazuje mi tylko całkowity rozmiar i liczbę kluczy na bazę danych, co nie daje mi zbyt wielu informacji ... Dlatego wszelkie narzędzia / pomysły, które dają mi więcej informacji podczas monitorowania serwera redis, byłyby mile widziane.

Dokumentacja Redis nie pokazuje mi żadnych poleceń, które mogą zwrócić zajętą ​​pamięć niektórych kluczy, więc myślę, że jeśli jakikolwiek błędny kod napisałby dużo "śmieci" do redis, może to być naprawdę trudne do znalezienia ...

Bernhard Vallant
źródło

Odpowiedzi:

113

A więc moje rozwiązanie własnego problemu: po redis-clidłuższej zabawie odkryłem, że DEBUG OBJECT <key>ujawnia coś w serializedlengthrodzaju klucza, co w rzeczywistości było czymś, czego szukałem ...

W przypadku całej bazy danych musisz zagregować wszystkie wartości, dla KEYS *których nie powinno być zbyt trudne w przypadku wybranego języka skryptowego ...

Złe jest to, że redis.io tak naprawdę nie ma wielu informacji DEBUG OBJECT.

Bernhard Vallant
źródło
1
Czy serializowana długość to rozmiar całego obiektu w bajtach?
rafian
18
@BernhardVallant, dzięki za odpowiedź. Poszedłem dalej i napisałem szybki skrypt, który drukuje wszystkie klucze i ich rozmiary w formacie czytelnym dla człowieka. Pomyślałem, że się podzielę. :) gist.github.com/epicserve/5699837
Brent O'Connor
13
Wartość serializedlength nie dotyczy rozmiaru pamięci! Jest to rozmiar, jaki zajęłyby obiekty podczas zapisywania do pliku RDB na dysku. Sprawdź kod źródłowy: github.com/antirez/redis/blob/… i github.com/antirez/redis/blob/…
Hugo Tavares
wydaje się, że nie ma sposobu na uzyskanie rozmiaru klucza, wartości lub klucza-wartości w pamięci (nie rozmiaru zrzuconego na dysk)
Avner Barr
4
Do Twojej wiadomości: nie kłopocz się próbowaniem czegokolwiek z DEBUG na AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Nawet znaleziono redis-cli
bigkeys utknęłyby w martwym punkcie
40

MEMORY USAGE key polecenie podaje liczbę bajtów potrzebnych do przechowywania klucza i jego wartości w pamięci RAM.

Zgłoszone użycie to suma alokacji pamięci dla danych i narzutów administracyjnych, których wymaga klucz jego wartość (źródłowa dokumentacja redis)

koleń
źródło
11
może być używana tylko wersja> 4.0
teik
15

Spójrz na ten projekt, który wyświetla kilka interesujących statystyk dotyczących przestrzeni kluczy w oparciu o wyrażenia regularne i prefiksy. Używa DEBUG OBJECTpolecenia i skanuje bazę danych, identyfikując grupy kluczy i szacując procent zajmowanego miejsca.

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

Wynik wygląda następująco:

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  
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  

Lub ten: https://github.com/sripathikrishnan/redis-rdb-tools, który przeprowadza pełną analizę całej przestrzeni kluczy, analizując plik dump.rdb offline. Ten też działa dobrze. Może podać średni / minimalny / maksymalny rozmiar wpisów w twojej bazie danych, a nawet zrobi to na podstawie prefiksu.

jumand
źródło
8

Próbkowanie kluczy Redis i grupowanie ich według typu może być bardzo przydatne. Salvatore napisał narzędzie o nazwie redis-sampler, które wydaje około 10000 RANDOMKEYpoleceń, po których następuje TYPEodzyskane klucze. W ciągu kilku sekund lub minut powinieneś uzyskać dość dokładny obraz rozkładu typów kluczy.

Napisałem rozszerzenie (niestety nie nigdzie open-source, ponieważ jest związane z pracą), które dodaje trochę introspekcji nazw kluczy za pomocą wyrażeń regularnych, które dają wyobrażenie o tym, jakiego rodzaju klucze aplikacji (zgodnie z dowolną strukturą nazewnictwa) using), są przechowywane w Redis. W połączeniu z bardziej ogólnym wyjściem redis-sampler, powinno to dać bardzo dobre wyobrażenie o tym, co się dzieje.

rlotun
źródło
7
Tks, właściwie pomogło mi bardziej niżredis-cli --bigkeys
nmat
4

Być może możesz przeprowadzić introspekcję w pliku db. Protokół jest stosunkowo prosty (ale nie jest dobrze udokumentowany), więc możesz napisać dla niego parser, który określi, które klucze zajmują dużo miejsca.


Nowe sugestie:

Czy próbowałeś używać, MONITORaby zobaczyć, co jest napisane, na żywo? Być może uda Ci się znaleźć problem z danymi w ruchu.

Donald Miner
źródło
Wydaje się to interesujące, ale mimo to próbuję znaleźć łatwy sposób monitorowania zużycia pamięci redis na serwerze ... Zbadanie zrzutu wydaje mi się bardziej praktyczne do debugowania, nie wspominając o tym, że jest ich kilka koncerty teraz!
Bernhard Vallant
Powinieneś zapytać listę mailingową redis. Naprawdę interesuje mnie usłyszenie „najlepszej” odpowiedzi na to pytanie.
Donald Miner
Cóż, już próbowałem INFOi MONITOR, ale może głównym problemem jest to, że kiedy nie oglądałem, redis urósł naprawdę ...
Bernhard Vallant
Ok, wysłałem to na ich listę mailingową, ale znalazłem odpowiedź również na własną rękę ... Zobacz poniżej!
Bernhard Vallant
re. introspekcja w pliku db - napisałem skrypt do analizowania plików dump.rdb i wypisywania pliku csv raportującego przybliżoną pamięć używaną przez każdy klucz. Zobacz github.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan
1

Zwykle wolę metodę próbkowania kluczy do rozwiązywania takich scenariuszy.

redis-cli -p 6379 -n numer_db --bigkeys

Na przykład:-

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

anrajme
źródło
Dlaczego jest to metoda „próbkowania klucza”? Uważam, że jest to bardzo ograniczone, ponieważ pokazuje tylko wierzchołek góry lodowej.
MrR
0

Co powiesz na redis-cli, aby uzyskać KEYNAME | wc -c

Ed Greenberg
źródło