Felsöka överskridna tidsgränser för Azure Cache for RedisTroubleshoot Azure Cache for Redis timeouts

I det här avsnittet beskrivs fel sökning av tids gräns problem som uppstår vid anslutning till Azure cache för Redis.This section discusses troubleshooting timeout issues that occur when connecting to Azure Cache for Redis.

Anteckning

Flera av fel söknings stegen i den här hand boken innehåller instruktioner för att köra Redis-kommandon och övervaka olika prestanda mått.Several of the troubleshooting steps in this guide include instructions to run Redis commands and monitor various performance metrics. Mer information och instruktioner finns i artiklarna i avsnittet Ytterligare information .For more information and instructions, see the articles in the Additional information section.

Redis Server-uppdateringRedis server patching

Azure cache för Redis uppdaterar regelbundet sin server program vara som en del av den hanterade tjänst funktionen som den tillhandahåller.Azure Cache for Redis regularly updates its server software as part of the managed service functionality that it provides. Den här uppdaterings aktiviteten sker i stort sett bakom scenen.This patching activity takes place largely behind the scene. Under redundansväxlingen när Redis korrigeras kan Redis-klienter som är anslutna till dessa noder uppleva tillfälliga tids gränser när anslutningar växlas mellan dessa noder.During the failovers when Redis server nodes are being patched, Redis clients connected to these nodes may experience temporary timeouts as connections are switched between these nodes. Se Hur kan en redundansväxling påverka klient programmet för mer information om vilka uppdaterings funktioner på sidan som kan ha på ditt program och hur du kan förbättra hanteringen av uppdaterings händelser.See How does a failover affect my client application for more information on what side-effects patching can have on your application and how you can improve its handling of patching events.

Timeout-undantag för StackExchange. RedisStackExchange.Redis timeout exceptions

StackExchange. Redis använder en konfigurations inställning med namnet synctimeout för synkrona åtgärder med standardvärdet 5000 MS.StackExchange.Redis uses a configuration setting named synctimeout for synchronous operations with a default value of 5000 ms. Om ett synkront anrop inte slutförs i den här tiden, genererar StackExchange. Redis-klienten ett tids gräns fel som liknar följande exempel:If a synchronous call doesn’t complete in this time, the StackExchange.Redis client throws a timeout error similar to the following example:

    System.TimeoutException: Timeout performing MGET 2728cc84-58ae-406b-8ec8-3f962419f641, inst: 1,mgr: Inactive, queue: 73, qu=6, qs=67, qc=0, wr=1/1, in=0/0 IOCP: (Busy=6, Free=999, Min=2,Max=1000), WORKER (Busy=7,Free=8184,Min=2,Max=8191)

Det här fel meddelandet innehåller mått som kan hjälpa dig att peka på orsaken och möjlig lösning av problemet.This error message contains metrics that can help point you to the cause and possible resolution of the issue. Följande tabell innehåller information om måtten för fel meddelanden.The following table contains details about the error message metrics.

Mått för fel meddelandeError message metric InformationDetails
Instinst I det senaste tillfället, sektorn: 0 kommandon har utfärdatsIn the last time slice: 0 commands have been issued
hanteraremgr Socket Manager gör socket.select , vilket innebär att den ber operativ systemet att ange en socket som har något att göra.The socket manager is doing socket.select, which means it's asking the OS to indicate a socket that has something to do. Läsaren läser inte aktivt från nätverket eftersom det inte tycker att det finns något att göraThe reader isn't actively reading from the network because it doesn't think there's anything to do
queue Det finns 73 totala pågående åtgärderThere are 73 total in-progress operations
ququ 6 av pågående åtgärder finns i den ej skickade kön och har ännu inte skrivits till det utgående nätverket6 of the in-progress operations are in the unsent queue and haven't yet been written to the outbound network
qsqs 67 av pågående åtgärder har skickats till servern, men ett svar är ännu inte tillgängligt.67 of the in-progress operations have been sent to the server but a response isn't yet available. Svaret kan vara Not yet sent by the server eller sent by the server but not yet processed by the client.The response could be Not yet sent by the server or sent by the server but not yet processed by the client.
KSqc 0 av pågående åtgärder har läst svar men har ännu inte marker ATS som slutförda eftersom de väntar på slut för ande av slut för ande0 of the in-progress operations have seen replies but haven't yet been marked as complete because they're waiting on the completion loop
WRwr Det finns en aktiv skrivare (vilket innebär att 6 ej skickade förfrågningar inte ignoreras) byte/activewritersThere's an active writer (meaning the 6 unsent requests aren't being ignored) bytes/activewriters
inin Det finns inga aktiva läsare och inga byte som är tillgängliga för läsning på NÄTVERKSKORTets byte/activereadersThere are no active readers and zero bytes are available to be read on the NIC bytes/activereaders

Du kan använda följande steg för att undersöka möjliga rotor orsaker.You can use the following steps to investigate possible root causes.

  1. Ett bra tips är att se till att du använder följande mönster för att ansluta när du använder StackExchange. Redis-klienten.As a best practice, make sure you're using the following pattern to connect when using the StackExchange.Redis client.

    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
    {
        return ConnectionMultiplexer.Connect("cachename.redis.cache.windows.net,abortConnect=false,ssl=true,password=...");
    
    });
    
    public static ConnectionMultiplexer Connection
    {
        get
        {
            return lazyConnection.Value;
        }
    }
    

    Mer information finns i ansluta till cachen med hjälp av stackexchange. Redis.For more information, see Connect to the cache using StackExchange.Redis.

  2. Kontrol lera att servern och klient programmet finns i samma region i Azure.Ensure that your server and the client application are in the same region in Azure. Du kan till exempel få tids gränser när cachen är i östra USA men klienten är i västra USA och begäran inte slutförs inom synctimeout intervallet, eller så kan du få tids gränser när du felsöker från den lokala utvecklings datorn.For example, you might be getting timeouts when your cache is in East US but the client is in West US and the request doesn't complete within the synctimeout interval or you might be getting timeouts when you're debugging from your local development machine.

    Vi rekommenderar starkt att ha cachen och i klienten i samma Azure-region.It’s highly recommended to have the cache and in the client in the same Azure region. Om du har ett scenario som omfattar anrop mellan regioner bör du ange synctimeout ett värde som är högre än standard intervallet 5000-MS genom att inkludera en synctimeout egenskap i anslutnings strängen.If you have a scenario that includes cross region calls, you should set the synctimeout interval to a value higher than the default 5000-ms interval by including a synctimeout property in the connection string. I följande exempel visas ett kodfragment till en anslutnings sträng för StackExchange. Redis som tillhandahålls av Azure cache för Redis med en synctimeout till 2000 MS.The following example shows a snippet of a connection string for StackExchange.Redis provided by Azure Cache for Redis with a synctimeout of 2000 ms.

    synctimeout=2000,cachename.redis.cache.windows.net,abortConnect=false,ssl=true,password=...
    
  3. Se till att du använder den senaste versionen av stackexchange. Redis NuGet-paketet.Ensure you using the latest version of the StackExchange.Redis NuGet package. Det finns buggar som ständigt korrigeras i koden för att göra det mer stabilt för timeout så att den senaste versionen är viktig.There are bugs constantly being fixed in the code to make it more robust to timeouts so having the latest version is important.

  4. Om dina begär Anden är kopplade till bandbredds begränsningar på servern eller klienten tar det längre tid att slutföra dem och kan orsaka timeout.If your requests are bound by bandwidth limitations on the server or client, it takes longer for them to complete and can cause timeouts. Om du vill se om din tids gräns är på grund av nätverks bandbredd på servern, se begränsning på Server sidans bandbredd.To see if your timeout is because of network bandwidth on the server, see Server-side bandwidth limitation. Om du vill se om din timeout beror på klientens nätverks bandbredd kan du läsa bandbredds begränsning på klient sidan.To see if your timeout is because of client network bandwidth, see Client-side bandwidth limitation.

  5. Får du processor gränser på servern eller på klienten?Are you getting CPU bound on the server or on the client?

    • Kontrol lera om du har bundits till processor på klienten.Check if you're getting bound by CPU on your client. Hög CPU kan orsaka att begäran inte bearbetas inom synctimeout intervallet och orsakar en tids gräns för begäran. Att flytta till en större klient storlek eller distribuera belastningen kan hjälpa dig att kontrol lera det här problemet.High CPU could cause the request to not be processed within the synctimeout interval and cause a request to time out. Moving to a larger client size or distributing the load can help to control this problem.
    • Kontrol lera om du får CPU-bindning på servern genom att övervaka prestanda måttetför processorns cache.Check if you're getting CPU bound on the server by monitoring the CPU cache performance metric. Begär Anden som kommer i Redis är processor gränser kan orsaka timeout för dessa begär Anden. För att åtgärda det här tillståndet kan du distribuera belastningen över flera Shards i en Premium-cache eller uppgradera till en större storleks-eller pris nivå.Requests coming in while Redis is CPU bound can cause those requests to time out. To address this condition, you can distribute the load across multiple shards in a premium cache, or upgrade to a larger size or pricing tier. Mer information finns i begränsning av bandbredd på Server sidan.For more information, see Server-side bandwidth limitation.
  6. Finns det några kommandon som tar lång tid att bearbeta på servern?Are there commands taking long time to process on the server? Tids krävande kommandon som tar lång tid att bearbeta på Redis-servern kan orsaka timeout.Long-running commands that are taking long time to process on the redis-server can cause timeouts. Mer information om tids krävande kommandon finns i långvariga kommandon.For more information about long-running commands, see Long-running commands. Du kan ansluta till Azure-cachen för Redis-instansen med hjälp av Redis-CLI-klienten eller Redis-konsolen.You can connect to your Azure Cache for Redis instance using the redis-cli client or the Redis Console. Kör sedan kommandot SLOWLOG för att se om det finns begär Anden långsammare än förväntat.Then, run the SLOWLOG command to see if there are requests slower than expected. Redis-servern och StackExchange. Redis är optimerade för många små begär anden i stället för färre stora begär Anden.Redis Server and StackExchange.Redis are optimized for many small requests rather than fewer large requests. Att dela upp data i mindre segment kan förbättra saker här.Splitting your data into smaller chunks may improve things here.

    Information om hur du ansluter till din Caches TLS/SSL-slutpunkt med Redis-CLI och stunnelserver finns i blogg inlägget om ASP.net session State Provider för för hands versionen av Redis.For information on connecting to your cache's TLS/SSL endpoint using redis-cli and stunnel, see the blog post Announcing ASP.NET Session State Provider for Redis Preview Release.

  7. Hög redis server belastning kan orsaka timeout.High Redis server load can cause timeouts. Du kan övervaka Server belastningen genom att övervaka Redis Server Load cachens prestanda mått.You can monitor the server load by monitoring the Redis Server Load cache performance metric. En server belastning på 100 (maximalt värde) betyder att Redis-servern har varit upptagen, utan att det tar tid att bearbeta begär Anden.A server load of 100 (maximum value) signifies that the redis server has been busy, with no idle time, processing requests. Om du vill se om vissa begär Anden tar upp all Server kapacitet kör du kommandot SlowLog enligt beskrivningen i föregående stycke.To see if certain requests are taking up all of the server capability, run the SlowLog command, as described in the previous paragraph. Mer information finns i hög CPU-användning/server belastning.For more information, see High CPU usage / Server Load.

  8. Fanns det någon annan händelse på klient sidan som kunde ha orsakat ett nätverks-blip?Was there any other event on the client side that could have caused a network blip? Vanliga händelser är: skala upp eller ned antalet klient instanser, distribuera en ny version av klienten eller autoskalning aktive rad.Common events include: scaling the number of client instances up or down, deploying a new version of the client, or autoscale enabled. I vår testning har vi upptäckt att automatisk skalning eller skalning upp/ned kan orsaka att utgående nätverks anslutning går förlorad i flera sekunder.In our testing, we have found that autoscale or scaling up/down can cause outbound network connectivity to be lost for several seconds. StackExchange. Redis-koden är elastisk för sådana händelser och återansluter.StackExchange.Redis code is resilient to such events and reconnects. Vid åter anslutning kan eventuella begär anden i kön vara timeout.While reconnecting, any requests in the queue can time out.

  9. Fanns det en stor begäran innan flera små begär anden till cachen som nådde tids gränsen?Was there a large request preceding several small requests to the cache that timed out? Parametern qs i fel meddelandet visar hur många begär Anden som skickades från klienten till servern, men inte bearbetat något svar.The parameter qs in the error message tells you how many requests were sent from the client to the server, but haven't processed a response. Det här värdet kan fortsätta att växa eftersom StackExchange. Redis använder en enda TCP-anslutning och bara kan läsa ett svar åt gången.This value can keep growing because StackExchange.Redis uses a single TCP connection and can only read one response at a time. Även om den första åtgärden uppnåddes, stoppas inte data från att skickas till eller från servern.Even though the first operation timed out, it doesn't stop more data from being sent to or from the server. Andra förfrågningar kommer att blockeras tills den stora begäran har avslut ATS och kan orsaka timeout.Other requests will be blocked until the large request is finished and can cause time outs. En lösning är att minimera risken för timeout genom att se till att cachen är tillräckligt stor för arbets belastningen och dela upp stora värden i mindre segment.One solution is to minimize the chance of timeouts by ensuring that your cache is large enough for your workload and splitting large values into smaller chunks. En annan möjlig lösning är att använda en pool med ConnectionMultiplexer objekt i klienten och välja det lägsta som läses in ConnectionMultiplexer när en ny begäran skickas.Another possible solution is to use a pool of ConnectionMultiplexer objects in your client, and choose the least loaded ConnectionMultiplexer when sending a new request. Om du läser in över flera anslutnings objekt bör du förhindra att en tids gräns går ut för andra begär Anden.Loading across multiple connection objects should prevent a single timeout from causing other requests to also time out.

  10. Om du använder RedisSessionStateProvider , kontrol lera att du har angett ett nytt timeout-värde på rätt sätt.If you're using RedisSessionStateProvider, ensure you have set the retry timeout correctly. retryTimeoutInMilliseconds måste vara högre än operationTimeoutInMilliseconds , annars sker inga återförsök.retryTimeoutInMilliseconds should be higher than operationTimeoutInMilliseconds, otherwise no retries occur. I följande exempel retryTimeoutInMilliseconds är inställt på 3000.In the following example retryTimeoutInMilliseconds is set to 3000. Mer information finns i ASP.net för session State för Azure cache för Redis och hur du använder konfigurations parametrar för providern för sessionstillstånd och providern för utdatacache.For more information, see ASP.NET Session State Provider for Azure Cache for Redis and How to use the configuration parameters of Session State Provider and Output Cache Provider.

    <add
      name="AFRedisCacheSessionStateProvider"
      type="Microsoft.Web.Redis.RedisSessionStateProvider"
      host="enbwcache.redis.cache.windows.net"
      port="6380"
      accessKey="…"
      ssl="true"
      databaseId="0"
      applicationName="AFRedisCacheSessionState"
      connectionTimeoutInMilliseconds = "5000"
      operationTimeoutInMilliseconds = "1000"
      retryTimeoutInMilliseconds="3000" />
    
  11. Kontrol lera minnes användningen på Azure-cachen för Redis-servern genom att övervaka Used Memory RSS och Used Memory .Check memory usage on the Azure Cache for Redis server by monitoring Used Memory RSS and Used Memory. Om en princip för borttagning är på plats börjar Redis att avlägsna nycklar när Used_Memory den når cachestorleken.If an eviction policy is in place, Redis starts evicting keys when Used_Memory reaches the cache size. Helst Used Memory RSS bör helst vara något högre än Used memory .Ideally, Used Memory RSS should be only slightly higher than Used memory. En stor skillnad innebär att det finns fragmentering (intern eller extern).A large difference means there's memory fragmentation (internal or external). När Used Memory RSS är mindre än Used Memory innebär det att en del av cacheminnet har bytts ut av operativ systemet.When Used Memory RSS is less than Used Memory, it means part of the cache memory has been swapped by the operating system. Om den här växlingen sker kan du förvänta några viktiga fördröjningar.If this swapping occurs, you can expect some significant latencies. Eftersom Redis inte har kontroll över hur dess tilldelningar mappas till minnes sidor, är hög Used Memory RSS ofta resultatet av en insamling i minnes användningen.Because Redis doesn't have control over how its allocations are mapped to memory pages, high Used Memory RSS is often the result of a spike in memory usage. När Redis-servern frigör minne, tar allokerat minne, men det kan eventuellt inte ge minnet tillbaka till systemet.When Redis server frees memory, the allocator takes the memory but it may or may not give the memory back to the system. Det kan finnas en avvikelse mellan det Used Memory värde och den minnes förbrukning som rapporteras av operativ systemet.There may be a discrepancy between the Used Memory value and memory consumption as reported by the operating system. Minnet kan ha använts och släppts av Redis men inte på datorn.Memory may have been used and released by Redis but not given back to the system. Du kan undvika minnes problem genom att göra följande:To help mitigate memory issues, you can do the following steps:

    • Uppgradera cacheminnet till en större storlek så att du inte kör mot minnes begränsningar i systemet.Upgrade the cache to a larger size so that you aren't running against memory limitations on the system.
    • Ange förfallo tider för nycklarna så att äldre värden tas bort proaktivt.Set expiration times on the keys so that older values are evicted proactively.
    • Övervaka used_memory_rss cache-måttet.Monitor the used_memory_rss cache metric. När det här värdet närmar sig storleken på cacheminnet kommer du förmodligen att börja se prestanda problem.When this value approaches the size of their cache, you're likely to start seeing performance issues. Distribuera data över flera Shards om du använder en Premium-cache, eller uppgradera till en större cachestorlek.Distribute the data across multiple shards if you're using a premium cache, or upgrade to a larger cache size.

    Mer information finns i minnes belastning på Redis-servern.For more information, see Memory pressure on Redis server.

Ytterligare informationAdditional information