Delen via


Veelgestelde vragen over cachebeheer

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

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

  • Gebruik redis-benchmark.exe deze om uw Redis-server te testen. Gebruik redis-benchmark.exe deze om een idee te krijgen van de mogelijke doorvoer voordat u uw eigen prestatietests schrijft.
  • Gebruik redis-cli deze optie om de cache te controleren met behulp van de INFO opdracht. Zie Hoe kan ik Redis-opdrachten uitvoeren voor instructies over het downloaden van de Redis-tools?
  • Als u Transport Layer Security/Secure Socket Layer (TLS/SSL) gebruikt op uw cache-instantie, voegt u de --tls parameter toe aan uw Redis Tools-opdrachten of gebruikt u een proxy-like stunnel om TLS/SSL in te schakelen.
  • Redis-benchmark Gebruikt standaard poort 6379 . Gebruik de -p parameter om deze instelling te overschrijven als uw cache gebruikmaakt van de SSL/TLS-poort 6380 of de Enterprise-laagpoort 10000.
  • Indien nodig kunt u de niet-TLS-poort inschakelen via de Azure Portal voordat u de belastingstest uitvoert.
  • Zorg ervoor dat de virtuele clientmachine (VM) die u gebruikt voor het testen, zich in dezelfde regio bevindt als uw Azure Cache voor Redis-exemplaar.
  • Zorg ervoor dat uw client-VM ten minste evenveel reken- en bandbreedtecapaciteit heeft als de cache die u test. Gebruik voor de beste resultaten VM's uit de D-serie en E-serie voor uw clients.
  • Als u Windows gebruikt, schakelt u Virtual Receive-side Scaling (VRSS) in op de clientcomputer. Zie Virtuele schaling aan de ontvangstzijde in Windows Server 2012 R2 voor meer informatie.
  • Schakel diagnostische gegevens in voor cache, zodat u de status van uw cache kunt controleren . U kunt de metrische gegevens bekijken in de Azure Portal en u kunt uw metrische gegevens ook downloaden en controleren met behulp van de hulpprogramma's van uw keuze.
  • Als uw belasting een hoge geheugenfragmentatie veroorzaakt, schaalt u op naar een grotere cachegrootte.

In de volgende voorbeelden ziet u hoe u redis-benchmark.exe. Voer deze opdrachten uit vanaf een VM in dezelfde regio als uw cache voor nauwkeurige resultaten.

Test eerst pijplijnaanvragen SET met behulp van een payload van 1k:

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

Nadat u de test hebt uitgevoerd, voert u pijplijnaanvragen SETGET uit met behulp van een nettolading van 1k:

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

Hoe kan ik server GC inschakelen om meer doorvoer op de client te krijgen wanneer ik StackExchange.Redis gebruik?

Door server garbage collection (GC) in te schakelen, kan de client worden geoptimaliseerd en betere prestaties en doorvoer worden geboden wanneer u StackExchange.Redis gebruikt. Zie de volgende artikelen voor meer informatie over server GC en hoe u deze inschakelt:

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

De Redis-server biedt geen systeemeigen ondersteuning voor Transport Layer Security (TLS), maar Azure Cache for Redis biedt wel ondersteuning voor TLS. Als u verbinding maakt met Azure Cache for Redis met een client zoals StackExchange.Redis die TLS ondersteunt, gebruikt u TLS.

Notitie

De niet-TLS-poort is standaard uitgeschakeld voor nieuwe Azure Redis-exemplaren. Als uw client geen TLS ondersteunt, schakelt u de niet-TLS-poort in door de aanwijzingen op Toegangspoorten te volgen.

Als de cache TLS gebruikt, moet u TLS inschakelen met behulp van de --tls optie voor Redis-tools zoals redis-cli. U kunt ook een hulpprogramma stunnel gebruiken om de hulpprogramma's veilig te verbinden met de TLS-poort door de aanwijzingen te volgen in het blogbericht Aankondiging van ASP.NET sessiestatusprovider voor Redis Preview Release .

Zie Hoe kan ik Redis-opdrachten uitvoeren voor instructies over het downloaden van de Redis-tools?

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

  • Vermijd het gebruik van bepaalde Redis-opdrachten die lang duren, tenzij u het resultaat van deze opdrachten volledig begrijpt. Voer bijvoorbeeld de opdracht SLEUTELS niet uit in productie. Afhankelijk van het aantal sleutels kan het lang duren om terug te keren. Redis is een single-threaded server die commando's één voor één verwerkt. Als u de KEYS opdracht geeft, verwerkt Redis de volgende opdrachten pas nadat de opdracht is verwerkt KEYS .

    De redis.io site bevat details over de tijdscomplexiteit voor elke bewerking die wordt ondersteund. Selecteer elke opdracht om de complexiteit voor elke bewerking te bekijken.

  • Welke grootte toetsen u moet gebruiken, hangt af van het scenario. Als voor uw scenario grotere toetsen zijn vereist, kunt u de ConnectionTimeoutwaarden voor opnieuw proberen en de logica voor opnieuw proberen aanpassen. Vanuit het perspectief van een Redis-server zorgen kleinere sleutelwaarden voor betere prestaties.

  • Deze overwegingen betekenen niet dat u geen grotere waarden kunt opslaan in Redis, maar de latenties zijn hoger. Als u een set gegevens hebt die groter is dan een andere, kunt u meerdere ConnectionMultiplexer exemplaren gebruiken, elk geconfigureerd met een andere set time-out- en opnieuw proberende waarden. Zie Wat doen de configuratieopties van StackExchange.Redis voor meer informatie?

Wat zijn enkele prestatieoverwegingen voor verbindingen?

Elke prijscategorie van Azure Cache for Redis heeft verschillende limieten voor clientverbindingen, geheugen en bandbreedte. Hoewel elke cachegrootte een bepaald aantal verbindingen mogelijk maakt, brengt elke verbinding met Redis bijbehorende overhead met zich mee. Een voorbeeld van dergelijke overhead is het CPU- en geheugengebruik als gevolg van TLS/SSL-codering.

Bij de maximale verbindingslimiet voor een bepaalde cachegrootte wordt uitgegaan van een licht geladen cache. Als de belasting van de overhead van de verbinding en de belasting van clientbewerkingen de capaciteit van het systeem overschrijdt, kunnen er capaciteitsproblemen optreden in de cache, zelfs als u de verbindingslimiet voor de huidige cachegrootte niet overschrijdt.

Zie Prijzen voor Azure Cache voor Redis voor meer informatie over de verbindingslimieten voor elke laag. Zie De standaardconfiguratie van de Redis-server voor meer informatie over verbindingen en andere standaardconfiguraties.

Wat zijn best practices voor productie?

  • Gebruik de Standard- of Premium-laag voor productiesystemen. De Basic Tier is een systeem met één knooppunt zonder gegevensreplicatie en zonder Service Level Agreement (SLA). Gebruik ook ten minste een C1-cache voor productie. C0-caches worden doorgaans gebruikt voor eenvoudige ontwikkel-/testscenario's.
  • Houd er rekening mee dat Redis een in-memory gegevensarchief is en dat er in sommige scenario's gegevensverlies kan optreden. Zie Problemen met gegevensverlies in Azure Cache voor Redis oplossen voor meer informatie.
  • Ontwikkel uw systeem zodat het bestand is tegen verbindingsproblemen die worden veroorzaakt door patching en failover.
  • Gebruik Azure Redis-exemplaren in de Premium-laag voor een betere netwerklatentie en -doorvoer, omdat ze betere hardware hebben voor zowel de CPU als het netwerk.

Best practices voor StackExchange.Redis

  • Stel in AbortConnect op onwaar en laat de ConnectionMultiplexer verbinding automatisch opnieuw maken.
  • Gebruik één exemplaar met een lange levensduur ConnectionMultiplexer in plaats van een nieuwe verbinding te maken voor elke aanvraag.
  • Redis werkt het beste met kleinere waarden, dus overweeg om grotere gegevens in meerdere sleutels op te slaan. Bijvoorbeeld, in Wat is de ideale waarde groottebereik voor redis?, wordt 100 kb als groot beschouwd. Zie Meer sleutels en kleinere waarden overwegen voor meer informatie.
  • Configureer de ThreadPool-instellingen om time-outs te voorkomen.
  • Gebruik minimaal de standaard connectTimeout van 5 seconden. Dit interval geeft StackExchange.Redis voldoende tijd om de verbinding opnieuw tot stand te brengen als er een netwerkblip is.
  • Houd rekening met de prestatiekosten die gepaard gaan met verschillende bewerkingen die u uitvoert. De KEYS opdracht is bijvoorbeeld een O(n)-bewerking en moet worden vermeden. De redis.io site bevat details over de tijdscomplexiteit van elke bewerking die wordt ondersteund. Selecteer elke opdracht om de complexiteit voor elke bewerking te bekijken.

Belangrijke details over threadpoolgroei

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

  • WORKER Threads worden gebruikt voor zaken als het verwerken van de Task.Run(…), of ThreadPool.QueueUserWorkItem(…) methoden. Verschillende componenten in de CLR gebruiken deze threads ook wanneer er aan een achtergrondthread moet worden gewerkt.
  • IOCP threads worden gebruikt voor asynchrone I/O, zoals bij het lezen van het netwerk.

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

Zodra het aantal bestaande bezette 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 uitbarsting van werk krijgt waarvoor een IOCP thread nodig is, wordt dat werk meestal snel verwerkt. Als de burst echter meer is dan de geconfigureerde minimum instelling, is er enige vertraging bij het verwerken van een deel van het werk omdat de ThreadPool wacht op een van de volgende twee mogelijkheden:

  • Een bestaande thread wordt vrij om het werk te verwerken.
  • Geen enkele bestaande thread komt vrij gedurende 500 ms, dus wordt er een nieuwe thread gemaakt.

Kortom, wanneer het aantal threads groter is dan Busy threads, ervaart u een vertraging van Min 500 ms voordat de toepassing het netwerkverkeer verwerkt. Ook wordt een bestaande thread die langer dan 15 seconden inactief blijft, opgeruimd, en deze cyclus van groei en krimp kan zich herhalen.

Foutberichten van StackExchange.Redis build 1.0.450 of hoger drukken ThreadPool-statistieken af, zoals wordt weergegeven in het volgende voorbeeld.

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)

Het voorbeeld laat zien dat er voor de IOCP thread zes bezette threads zijn en dat het systeem is geconfigureerd om minimaal vier threads toe te staan. In dit geval zal de client waarschijnlijk twee vertragingen van 500 ms zien, omdat 6 > 4.

Notitie

StackExchange.Redis kan time-outs krijgen als de groei van een van IOCP beide WORKER threads wordt beperkt.

Het is het beste om de minimale configuratiewaarde voor IOCP en WORKER threads in te stellen op iets dat groter is dan de standaardwaarde. Er is geen pasklare richtlijn voor deze waarde, omdat de juiste waarde voor de ene toepassing waarschijnlijk te hoog of te laag is voor een andere toepassing. Deze instelling kan ook van invloed zijn op de prestaties van andere onderdelen van gecompliceerde toepassingen. U moet deze instelling afstemmen op uw specifieke behoeften. Een goede startplaats is 200 of 300. Test en pas vervolgens aan als dat nodig is.

Configureer de instelling voor minimale threads

U kunt deze instelling programmatisch wijzigen met behulp van de methode ThreadPool.SetMinThreads (...).

In NET Framework stel je deze waarde bijvoorbeeld in Global.asax.cs in de Application_Start methode in:

    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);
    }

Als u .NET Core gebruikt, stelt u de waarde in Program.cs vlak voor de aanroep in op WebApplication.CreateBuilder():

    const int minThreads = 200
                  
    ThreadPool.SetMinThreads(minThreads, minThreads);
    
    var builder = WebApplication.CreateBuilder(args);
    // rest of application setup

Notitie

De waarde die met deze methode wordt opgegeven, is een algemene instelling die van invloed is op het hele AppDomain. Als u bijvoorbeeld een VM met vier cores hebt en deze tijdens runtime wilt instellen minWorkerThreadsminIoThreads op 50 per CPU, gebruikt u ThreadPool.SetMinThreads(200, 200).

Het is ook mogelijk om de minimale threads-instelling op te geven met behulp van de minIoThreadsminWorkerThreads of onder het <processModel> configuratie-element in Machine.config. Machine.config bevindt zich meestal op %SystemRoot%\Microsoft.NET\Framework\<versionNumber>\CONFIG\.

Het wordt niet aanbevolen om het aantal minimale threads op deze manier in te stellen, omdat het een instelling voor het hele systeem is. Als u op deze manier een minimum aantal threads instelt, moet u de applicatiegroep opnieuw opstarten.

Notitie

De waarde die met deze methode wordt opgegeven, is een instelling per kern . Als u bijvoorbeeld een machine met vier cores hebt en wilt dat uw minIoThreads instelling 200 is tijdens runtime, gebruikt u <processModel minIoThreads="50">.