Azure Cache voor Redis veelgestelde vragen over beheer

Dit artikel bevat antwoorden op veelgestelde vragen over het beheren van Azure Cache voor Redis.

Wanneer moet ik de niet-TLS/SSL-poort inschakelen om verbinding te maken met Redis?

Redis-server biedt geen systeemeigen ondersteuning voor TLS, maar Azure Cache voor Redis wel. Als u verbinding maakt met Azure Cache voor Redis en uw client TLS ondersteunt, zoals StackExchange.Redis, gebruikt u TLS.

Notitie

De niet-TLS-poort is standaard uitgeschakeld voor nieuwe Azure Cache voor Redis exemplaren. Als uw client TLS niet ondersteunt, moet u de niet-TLS-poort inschakelen door de instructies te volgen in de sectie Toegangspoorten van het artikel Een cache configureren in Azure Cache voor Redis artikel.

Redis-hulpprogramma's zoals redis-cli werken niet met de TLS-poort, maar u kunt een hulpprogramma zoals gebruiken om de hulpprogramma's stunnel veilig te verbinden met de TLS-poort door de instructies in het blogbericht Aankondiging van ASP.NET Session State Provider for Redis Preview Release te volgen.

Zie de sectie Hoe kan ik Redis-opdrachten uitvoeren? voor instructies over het downloaden van de Redis-hulpprogramma's .

Wat zijn enkele best practices voor productie?

Best practices voor StackExchange.Redis

  • Stel in AbortConnect op false en laat de ConnectionMultiplexer vervolgens automatisch opnieuw verbinding maken.
  • Gebruik één exemplaar met een lange levensduur ConnectionMultiplexer in plaats van voor elke aanvraag een nieuwe verbinding te maken. Zie de RedisConnection klasse in Verbinding maken met de cache met Redisconnection voor een voorbeeld van het beheren van een verbinding.
  • Redis werkt het beste met kleinere waarden, dus overweeg om grotere gegevens in meerdere sleutels op te slaan. In deze Redis-discussie wordt 100 kB als groot beschouwd. Zie Best practices ontwikkelen voor meer informatie.
  • Configureer uw ThreadPool-instellingen om time-outs te voorkomen.
  • Gebruik ten minste de standaard connectTimeout van 5 seconden. Dit interval geeft StackExchange.Redis voldoende tijd om de verbinding opnieuw tot stand te brengen als er een netwerklip is.
  • Houd rekening met de prestatiekosten die zijn gekoppeld aan de verschillende bewerkingen die u uitvoert. De opdracht is bijvoorbeeld KEYS een O(n)-bewerking en moet worden vermeden. De redis.io-site bevat details over de complexiteit van de tijd voor elke bewerking die wordt ondersteund. Selecteer elke opdracht om de complexiteit voor elke bewerking te bekijken.

Configuratie en concepten

  • Gebruik de Standard- of Premium-laag voor productiesystemen. De laag Basic is een systeem met één knooppunt zonder gegevensreplicatie en zonder SLA. Gebruik minimaal een C1-cache. C0-caches worden doorgaans gebruikt voor eenvoudige ontwikkel-/testscenario's.
  • Houd er rekening mee dat Redis een gegevensarchief in het geheugen is. Zie Problemen met gegevensverlies in Azure Cache voor Redis oplossen zodat u op de hoogte bent van scenario's waarin gegevensverlies kan optreden voor meer informatie.
  • Ontwikkel uw systeem zodanig dat het verbindingsfouten kan verwerken die worden veroorzaakt door patches en failover.

Prestaties testen

  • Begin met het gebruik redis-benchmark.exe om een idee te krijgen van mogelijke doorvoer voordat u uw eigen prestatietests schrijft. Omdat redis-benchmark TLS niet wordt ondersteund, moet u de niet-TLS-poort inschakelen via de Azure Portal voordat u de test uitvoert. Zie Hoe kan ik benchmarken en de prestaties van mijn cache testen? voor voorbeelden.
  • De client-VM die voor het testen wordt gebruikt, moet zich in dezelfde regio bevinden als uw Azure Cache voor Redis-exemplaar.
  • We raden u aan de Dv2 VM-serie te gebruiken voor uw client, omdat deze betere hardware hebben en de beste resultaten moeten opleveren.
  • Zorg ervoor dat de client-VM die u kiest ten minste evenveel reken- en bandbreedtemogelijkheden heeft als de cache die u wilt testen.
  • Schakel VRSS in op de clientcomputer als u Windows gebruikt. Kijk hier voor meer informatie.
  • Redis-exemplaren van de Premium-laag hebben een betere netwerklatentie en doorvoer omdat ze worden uitgevoerd op betere hardware voor zowel CPU als netwerk.

Wat zijn enkele van de overwegingen bij het gebruik van algemene Redis-opdrachten?

  • Vermijd het gebruik van bepaalde Redis-opdrachten die veel tijd in beslag nemen, tenzij u het resultaat van deze opdrachten volledig begrijpt. Voer bijvoorbeeld de opdracht KEYS niet uit in productie. Afhankelijk van het aantal sleutels kan het lang duren om terug te keren. Redis is een server met één thread en verwerkt opdrachten een voor een. Als u andere opdrachten hebt die na SLEUTELS zijn uitgegeven, worden deze pas verwerkt als redis de opdracht KEYS verwerkt. De redis.io-site bevat details over de complexiteit van de tijd voor elke bewerking die wordt ondersteund. Selecteer elke opdracht om de complexiteit voor elke bewerking te bekijken.
  • Sleutelgrootten: moet ik kleine sleutel/waarden of grote sleutel/waarden gebruiken? Dit is afhankelijk van het scenario. Als voor uw scenario grotere sleutels zijn vereist, kunt u de ConnectionTimeout aanpassen, vervolgens de waarden opnieuw proberen en de logica voor opnieuw proberen aanpassen. Vanuit het perspectief van een Redis-server zorgen kleinere waarden voor betere prestaties.
  • Deze overwegingen betekenen niet dat u geen grotere waarden kunt opslaan in Redis; U moet rekening houden met de volgende overwegingen. Latentie zal hoger zijn. Als u één gegevensset hebt die groter en een kleinere set is, kunt u meerdere ConnectionMultiplexer-exemplaren gebruiken. Configureer elk met een andere set time-outs en waarden voor opnieuw proberen, zoals beschreven in de vorige sectie Wat doen de configuratieopties van StackExchange.Redis .

Hoe kan ik de prestaties van mijn cache benchmarken en testen?

Hier volgen enkele voorbeelden van het gebruik van redis-benchmark.exe. Voer deze opdrachten uit vanaf een VM in dezelfde regio als uw cache voor nauwkeurige results.cache-development-faq.yml

  • Set-aanvragen via pijplijn testen met een nettolading van 1k

    redis-benchmark.exe -h **yourcache**.redis.cache.windows.net -a **yourAccesskey** -t SET -n 1000000 -d 1024 -P 50

  • Get-aanvragen via pijplijn testen met behulp van een nettolading van 1.000.

Notitie

Voer eerst de SET-test uit die hierboven wordt weergegeven om de cache te vullen

redis-benchmark.exe -h **yourcache**.redis.cache.windows.net -a **yourAccesskey** -t GET -n 1000000 -d 1024 -P 50

Belangrijke details over de groei van threadpools

De CLR ThreadPool heeft twee typen threads: 'Worker' en 'I/O Completion Port' (IOCP).

  • Werkthreads worden gebruikt voor zaken als het verwerken van de Task.Run(…)- of ThreadPool.QueueUserWorkItem(…) -methoden. Deze threads worden ook gebruikt door verschillende onderdelen in de CLR wanneer er werk moet worden uitgevoerd op een achtergrondthread.
  • IOCP-threads worden gebruikt wanneer asynchrone IO plaatsvindt, zoals bij het lezen van het netwerk.

De threadgroep biedt nieuwe werkthreads of I/O-voltooiingsthreads op aanvraag (zonder beperking) totdat de instelling 'Minimum' voor elk type thread wordt bereikt. Standaard is het minimum aantal threads ingesteld op het aantal processors op een systeem.

Zodra het aantal bestaande (bezet) threads het 'minimum' aantal threads bereikt, beperkt de ThreadPool de snelheid waarmee nieuwe threads worden geïnjecteerd tot één thread per 500 milliseconden. Als uw systeem een piek van werk krijgt waarvoor een IOCP-thread nodig is, wordt dit meestal snel verwerkt. Als de burst echter groter is dan de geconfigureerde instelling 'Minimum', is er enige vertraging bij het verwerken van een deel van het werk omdat de ThreadPool wacht op een van de twee mogelijkheden:

  • Een bestaande thread kan het werk verwerken.
  • Er is geen bestaande thread beschikbaar gedurende 500 ms en er wordt een nieuwe thread gemaakt.

Als het aantal bezet threads groter is dan minimale threads, betaalt u waarschijnlijk een vertraging van 500 ms voordat het netwerkverkeer door de toepassing wordt verwerkt. Wanneer een bestaande thread langer dan 15 seconden inactief blijft, wordt deze opgeschoond en kan deze cyclus van groei en krimp zich herhalen.

Als we kijken naar een voorbeeldfoutbericht van StackExchange.Redis (build 1.0.450 of hoger), zien we dat er nu ThreadPool-statistieken worden afgedrukt. Zie IOCP- en WORKER-details hieronder.

System.TimeoutException: Timeout performing GET MyKey, inst: 2, mgr: Inactive,
queue: 6, qu: 0, qs: 6, qc: 0, wr: 0, wq: 0, in: 0, ar: 0,
IOCP: (Busy=6,Free=994,Min=4,Max=1000),
WORKER: (Busy=3,Free=997,Min=4,Max=1000)

Zoals weergegeven In het voorbeeld ziet u dat er voor IOCP-thread zes actieve threads zijn en dat het systeem is geconfigureerd om vier minimale threads toe te staan. In dit geval zou de client waarschijnlijk twee vertragingen van 500 ms hebben gezien, omdat 6 > 4.

Notitie

StackExchange.Redis kan time-outs ondervinden als de groei van IOCP- of WORKER-threads wordt beperkt.

Aanbeveling

Op basis van deze informatie raden we klanten ten zeerste aan om de minimale configuratiewaarde voor IOCP- en WORKER-threads in te stellen op iets dat groter is dan de standaardwaarde. We kunnen geen algemene richtlijnen geven over wat deze waarde moet zijn, omdat de juiste waarde voor de ene toepassing waarschijnlijk te hoog of laag is voor een andere toepassing. Deze instelling kan ook van invloed zijn op de prestaties van andere onderdelen van complexe toepassingen, dus elke klant moet deze instelling afstemmen op zijn specifieke behoeften. Een goede startplaats is 200 of 300, test en pas zo nodig aan.

Deze instelling configureren:

  • U wordt aangeraden deze instelling programmatisch te wijzigen met behulp van de methode ThreadPool.SetMinThreads (...) in global.asax.cs. Bijvoorbeeld:

    private readonly int minThreads = 200;
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        ThreadPool.SetMinThreads(minThreads, minThreads);
    }
    

    Notitie

    De waarde die met deze methode is opgegeven, is een globale instelling die van invloed is op het hele AppDomain. Als u bijvoorbeeld een machine met 4 kernen hebt en minWorkerThreads en minIoThreads tijdens runtime wilt instellen op 50 per CPU, gebruikt u ThreadPool.SetMinThreads(200, 200).

  • Het is ook mogelijk om de instelling voor minimale threads op te geven met behulp van de configuratie-instelling minIoThreads of minWorkerThreads onder het <processModel> configuratie-element in Machine.config. Machine.config bevindt zich meestal op %SystemRoot%\Microsoft.NET\Framework\[versionNumber]\CONFIG\. Het instellen van het minimum aantal threads op deze manier wordt niet aanbevolen, omdat dit een systeembrede instelling is.

    Notitie

    De waarde die in dit configuratie-element is opgegeven, is een instelling per kern . Als u bijvoorbeeld een computer met 4 kernen hebt en wilt dat de instelling minIoThreads tijdens runtime 200 is, gebruikt <processModel minIoThreads="50"/>u .

Server-GC inschakelen om meer doorvoer op de client te krijgen bij gebruik van StackExchange.Redis

Het inschakelen van server-GC kan de client optimaliseren en betere prestaties en doorvoer bieden bij het gebruik van StackExchange.Redis. Zie de volgende artikelen voor meer informatie over server-GC en hoe u deze kunt inschakelen:

Prestatieoverwegingen met betrekking tot verbindingen

Elke prijscategorie heeft verschillende limieten voor clientverbindingen, geheugen en bandbreedte. Hoewel elke cachegrootte een bepaald aantal verbindingen toestaat, heeft elke verbinding met Redis overhead. Een voorbeeld van dergelijke overhead is CPU- en geheugengebruik vanwege TLS/SSL-versleuteling. Bij de maximale verbindingslimiet voor een bepaalde cachegrootte wordt uitgegaan van een licht geladen cache. Als de belasting van de verbindingsoverhead plus de belasting van clientbewerkingen de capaciteit voor het systeem overschrijdt, kan de cache capaciteitsproblemen ondervinden, zelfs als u de verbindingslimiet voor de huidige cachegrootte niet hebt overschreden.

Zie prijzen voor Azure Cache voor Redis voor meer informatie over de verschillende verbindingslimieten voor elke laag. Zie Standaardconfiguratie van Redis-server voor meer informatie over verbindingen en andere standaardconfiguraties.

Volgende stappen

Meer informatie over veelgestelde vragen over andere Azure Cache voor Redis.