sql >> Database >  >> NoSQL >> Redis

Het geheugengebruik analyseren en optimaliseren in Redis

Redis is een in-memory datastore, wat inhoudt dat de gehele dataset in het geheugen (RAM) wordt opgeslagen. Hoewel dit geweldig is voor de prestaties, moet er steeds meer RAM worden toegevoegd om al die gegevens te bewaren wanneer de omvang van de gegevens begint te groeien. Dit kan snel onbetaalbaar worden en voordat je het weet, schieten de serverkosten omhoog, waardoor je je zorgen maakt of Redis op een kosteneffectieve manier voor je kan schalen.

Dit is natuurlijk een veelvoorkomend probleem bij elke database, maar doet meer pijn in het geval van in-memory databases zoals Redis, aangezien RAM duurder is dan secundaire opslag zoals harde schijven en SSD's. We moeten echter niet vergeten dat Redis niet bedoeld is om terabytes aan gegevens voor uw toepassing op te slaan. Het is eerder bedoeld om specifiek die gegevens op te slaan die moeten worden gelezen (en in mindere mate, geschreven) met een zeer hoge snelheid, terwijl de rest van uw gegevens zich in traditionele databases met schijfondersteuning kunnen bevinden. Daartoe wordt Redis het vaakst gebruikt als cache, met alleen de meest actieve gegevens met hoge lees-/schrijfdoorvoervereisten (denk aan scoreborden en realtime chatberichten). Daarom is de belangrijkste boosdoener voor overmatig geheugengebruik met Redis het toepassingsgedrag. Uw toepassing slaat mogelijk onnodige gegevens op die niet profiteren van Redis, of zelfs volledig redundante gegevens, d.w.z. gegevens die nooit voor welk doel dan ook worden gebruikt, zoals deze gebruiker was.

Om problemen met overmatig geheugengebruik te diagnosticeren, hebben we natuurlijk een manier nodig om erachter te komen welke toetsen het meeste geheugen gebruiken, zodat we kunnen beginnen te redeneren over en te begrijpen welk gedrag van de toepassing het probleem veroorzaakt. Onthoud dat voortijdige optimalisatie de wortel van alle kwaad is, en Redis is daarop geen uitzondering. We hebben absoluut inzicht in de geheugenkenmerken van onze dataset nodig om zelfs maar na te denken over waar het probleem ligt en hoe we het kunnen oplossen. Hieronder bekijken we enkele van de beschikbare opties om onze Redis-gegevens te bekijken en de gebieden te vinden die kunnen profiteren van optimalisatie op applicatieniveau.

Het MEMORY USAGE-commando

Deze toepasselijke naam is beschikbaar sinds Redis 4.0.0 en is de eerste stap om geheugenproblemen met Redis op te lossen. Uit de documenten:

De opdracht MEMORY USAGE rapporteert het aantal bytes dat een sleutel en de waarde ervan nodig hebben om in het RAM te worden opgeslagen. Het gerapporteerde gebruik is het totaal aan geheugentoewijzingen voor gegevens en administratieve overhead die een sleutel nodig heeft.

Hier is een voorbeeld:

MEMORY USAGE users_by_reputation
(integer) 2923419

Een eenvoudig geheel getal dat het aantal bytes vertegenwoordigt dat wordt gebruikt voor het opslaan van de sleutel, waarde en interne overheadkosten, wordt geretourneerd. Om snel het geheugengebruik van een bepaalde toets te vinden, wordt het niet eenvoudiger dan dit.

Twee mogelijke nadelen zijn:

  1. Deze opdracht is alleen beschikbaar in Redis 4.0.0 en hoger. Dit is exclusief de meeste cloudproviders.
  2. Het vertelt je alleen het geheugen dat door een enkele toets wordt gebruikt, dus tenzij je van tevoren weet welke toets of toetsen het probleem veroorzaken, heeft dit commando een zeer beperkte bruikbaarheid.

redis-rdb-tools

redis-rdb-tools is een handige kleine opdrachtregeltool die verder gaat dan het eenvoudige MEMORY USAGE commando dat we hierboven hebben besproken. Het is een populaire en krachtige tool voor geheugenprofilering die speciaal voor Redis is gebouwd en die een Redis-dumpbestand (.rdb) ontleedt en een gedetailleerd geheugenprofiel genereert voor elke sleutel in de dump, inclusief details zoals het gebruikte geheugen, het gegevenstype, het aantal elementen, enz. U kunt ook de sleutels filteren die worden verwerkt, zodat u desgewenst de analyse kunt uitvoeren op een bepaalde sleutel of een subset van sleutels die overeenkomen met een bepaald patroon. De output van de analyse is een CSV-bestand met kolommen voor de sleutel, het gebruikte geheugen, het gegevenstype, het aantal elementen, enz.

Deze tool is zo geweldig omdat, in tegenstelling tot de MEMORY USAGE commando, dat alleen op een enkele sleutel werkt, analyseert deze tool de hele dataset en spuugt het resultaat uit in CSV-indeling, wat betekent dat je het in elke SQL-database kunt laden en alle query's kunt uitvoeren die je wilt, het sorteren en filteren zoals je wilt , met alle kracht van SQL, waarmee u goed inzicht krijgt in de geheugenkosten van uw gegevens. Als een bonus, als u Redis-versies vóór 4.0.0 gebruikt, kunt u deze tool nog steeds gebruiken om enkele sleutels te analyseren als u dat wilt, aangezien deze tool werkt door de binaire dump die Redis produceert te ontleden, in plaats van te vertrouwen op Redis om geheugengebruik melden. Aan de andere kant betekent dit verschil in aanpak wel dat het berekende geheugengebruik meer een schatting is dan een exact cijfer, zoals vermeld in de projectdocumentatie. Dit is echter niet echt een probleem wanneer het ons doel is om problemen met het geheugengebruik te identificeren, aangezien we meer geïnteresseerd zijn in de relatieve grootte van de sleutels en het identificeren van sleutels die aanzienlijk meer geheugen gebruiken dan ze zouden moeten gebruiken, dus een paar bytes hier of daar is echt niet relevant.

RDBTools

RDBTools is een webgebaseerde tool die verschillende tools biedt om Redis te beheren en te optimaliseren, met de nadruk op geheugenoptimalisatie. Het is ontstaan ​​uit het hierboven besproken open source redis-rdb-tools-project. Hiermee kunnen we moeiteloos het geheugengebruik van onze Redis-server analyseren door simpelweg naar onze instantie te wijzen en op "Analyseren" te klikken. De tool downloadt een dump van de actieve instantie en analyseert deze, waardoor u een gelikte gebruikersinterface krijgt voor het filteren en sorteren van uw sleutels op basis van verschillende parameters zoals geheugengebruik, gegevenstype, codering, aantal elementen, enz., vergelijkbaar met de opdrachtregel tool, maar zonder de handmatige inspanning die nodig is om een ​​dump te maken, het geheugenprofiel te genereren, een database op te zetten, het profiel te importeren, query's te schrijven en uit te voeren, enz.

Afgezien daarvan genereert RDBTools ook verschillende grafieken en grafieken uit het geheugenprofiel, waardoor u nog meer inzicht krijgt in uw gegevens, samen met aanbevelingen voor het optimaliseren van de configuratie van uw Redis-server, gebaseerd op industriestandaarden en jarenlange ervaring met het optimaliseren van Redis, om eruit te persen nog meer geheugenbesparing. Afgezien van geheugenoptimalisatie, zijn er tal van andere functies die nuttig zijn voor iedereen die Redis gebruikt, zoals een ingebouwde rijke CLI, configuratie-editor met inline documentatie, rijke live-gegevensvisualisatie, enz.

RDBTools is beschikbaar als een docker-image, beschikbaar in docker-hub en kan op uw eigen machine worden uitgevoerd, dus u hoeft zich geen zorgen te maken over het lekken van gevoelige gegevens. Een proefversie is voor altijd gratis beschikbaar, met enkele gebruikslimieten. Bekijk de prijspagina voor meer informatie over de verschillende betaalde abonnementen die beschikbaar zijn.

Conclusie

Voldoende geheugen is een onvermijdelijk probleem bij het gebruik van in-memory databases zoals Redis. Zoals alle optimalisatieproblemen, is de eerste stap om het probleem correct te diagnosticeren. Het is belangrijk om de verleiding te weerstaan ​​om snel conclusies te trekken op basis van niet-geverifieerde hypothesen. "Meet, meet, meet" is de naam van het spel als het gaat om optimalisatie, en er zijn verschillende methoden en hulpmiddelen om inzicht te krijgen in uw Redis-geheugenproblemen. Welke het beste is, hangt af van uw specifieke behoeften en waar u zich in het ontwikkelingsproces bevindt. Voor iemand die net Redis begint te gebruiken, kan het voldoende zijn om afzonderlijke toetsen in de gaten te houden om te beginnen, terwijl voor zware gebruikers van Redis het zeker zinvol is om voor een speciale GUI-tool te gaan met alle toeters en bellen om later pijn te besparen. Wat je ook kiest, zorg er altijd voor dat je de kern van je probleem begrijpt voordat je het probeert op te lossen, en onthoud dat als je geheugenproblemen hebt met Redis, je waarschijnlijk meer geheugen gebruikt dan je echt nodig hebt.


  1. Hoe een sleutelpatroon zoeken in redis hash?

  2. Apache Spark komt naar Apache HBase met HBase-Spark-module

  3. MongoDB:FOUT:onderliggende proces mislukt, afgesloten met foutnummer 14

  4. Hoe vraag je *juist* Redis van Tornado?