it-swarm.com.de

StackExchange.Redis-Zeitüberschreitung

Die Produktionsumgebung befindet sich in Azure und verwendet Redis Cache Standard 2.5GB.

Beispiel 1

System.Web.HttpUnhandledException (0x80004005): Ausnahme vom Typ "System.Web.HttpUnhandledException" wurde ausgelöst. ---> StackExchange.Redis.RedisTimeoutException: Zeitüberschreitung bei SETNX User.313123, inst: 49, mgr: Inaktiv, Fehler: nie, Warteschlange: 0, qu: 0, qs: 0, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, Kundenname: PRD-VM-WEB-2, serverEndpoint: Nicht angegeben/Construct3.redis.cache.windows.net: 6380, keyHashSlot: 15649, IOCP: (Beschäftigt = 0, Frei = 1000, Min = 1, Max = 1000), ARBEITER: (Beschäftigt = 1, Frei = 32766, Min = 1, Max = 32767) (In diesem -Artikel finden Sie Informationen zu häufigen clientseitigen Problemen, die zu Zeitüberschreitungen führen können: http: // stackexchange .github.io/StackExchange.Redis/Timeouts ) um StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl [T] (Nachricht Nachricht, Prozessor ResultProcessor1 processor, ServerEndPoint server) in c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 2120 at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor1, ServerEndPoint-Server) in c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\RedisBase.cs: Zeile 81

Beispiel 2

StackExchange.Redis.RedisTimeoutException: Timeout beim Ausführen von GET ForumTopic.33831, inst: 1, mgr: Inaktiv, Fehler: nie, Warteschlange: 2, qu: 0, qs: 2, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, clientName: PRD-VM-WEB-2, serverEndpoint: Nicht angegeben/Construct3.redis.cache.windows.net: 6380, keyHashSlot: 5851, IOCP: (Busy = 0, Free = 1000, Min = 1, Max = 1000), WORKER: (Beschäftigt = 1, Frei = 32766, Min = 1, Max = 32767) (In diesem -Artikel finden Sie Informationen zu häufigen clientseitigen Problemen, die zu Zeitüberschreitungen führen können: http: // stackexchange .github.io/StackExchange.Redis/Timeouts ) um StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl [T] (Nachricht Nachricht, Prozessor ResultProcessor1 processor, ServerEndPoint server) in c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 2120 at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor1, ServerEndPoint-Server) in c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\RedisBase.cs: Zeile 81 at StackExchange.Redis.RedisDatabase.StringGet (RedisKey-Schlüssel.... CommandFlags-Flags) in c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\RedisDatabase.cs: Zeile 1647 um C3.Code.Controls.Application.Caching.Distributed.DistributedCacheController.Get [T] (String CacheKey) in C:\Construct.net\Source\C3Alpha2\Code\Controls\Application\Caching\Distributed\DistributedCacheController.cs: Zeile 115 bei C3.Code.Controls.Application.Caching.Manager.Manager.Get [T] (String Key, Func`1 getFromExternFunction, Boolean skipLocalCaches) in C:\Construct.net\Source\C3Alpha2\Code\Controls\Application\Caching\Manager\Manager.cs: Zeile 159 at C3.PageControls.Forums.TopicRender.Page_Load (Objektsender, EventArgs e) in C:\Construct.net\Source\C3Alpha2\PageControls\Forums\TopicRender.ascx.cs: Zeile 40 unter System.Web.UI.Control.OnLoad (EventArgs e) um System.Web.UI.Control.LoadRecursive () um System.Web.UI.Control.LoadRecursive () um System.Web.UI.Control.LoadRecursive () um System.Web.UI.Control.LoadRecursive () um System.Web.UI.Control.LoadRecursive () um System.Web.UI.Control.LoadRecursive () um System.Web.UI.Control.LoadRecursive () um System.Web.UI.Page.ProcessRequestMain (Boolean IncludeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Diese Fehler treten mehrmals am Tag sporadisch auf.

Ist dies ein Azure-Netzwerk-Blip oder kann ich etwas reduzieren? Wenn Sie sich die Anzahl der Fehler ansehen, scheint das nichts Ungewöhnliches zu sein, und die Serverlast scheint nie über 7% zu gehen, wie von Azure berichtet.

Redis Verbindung

internal static class RedisController
{
    private static readonly object GetConnectionLock = new object();
    public static ConnectionMultiplexer GetConnection()
    {
        if (Global.RedisConnection == null)
        {
            lock (GetConnectionLock)
            {
                if (Global.RedisConnection == null)
                {
                    Global.RedisConnection = ConnectionMultiplexer.Connect(
                        Settings.Deployment.RedisConnectionString);
                }
            }
        }
        return Global.RedisConnection;
    }
13
Tom Gullen

Es gibt 3 Szenarien, die zu Timeouts führen können, und es ist schwer zu wissen, welche im Spiel sind:

  1. die Bibliothek stolpert über; Es gibt insbesondere bekannte Probleme in Bezug auf die TLS-Implementierung und den Umgang mit der Leseschleife in Version 1. * der Bibliothek - etwas, in das wir eine lot - Zeit investiert haben, an der für Version 2. * gearbeitet wird : Es ist nicht immer ein triviales Update auf v2, insbesondere wenn Sie die Bibliothek als Teil eines anderen Codes verwenden, der von einer bestimmten Version abhängt.
  2. der Server/das Netzwerk stürzt ab; Dies ist eine sehr reale Möglichkeit - ein Blick auf "slowlog" kann hilfreich sein, wenn es serverseitig ist, aber ich habe keine Sichtbarkeit
  3. der Server und das Netzwerk sind in Ordnung, und die Bibliothek tut, was sie kann, aber es gibt ein paar riesige Flecken zwischen Client und Server, die andere Vorgänge verzögern. Dies ist etwas, das ich jetzt zur Verbesserung von vornehme, und wenn dies sich als ein häufiges Problem herausstellt, werden wir vielleicht versuchen, gleichzeitige Verbindungen besser zu nutzen (was die Bandbreite nicht erhöht, kann jedoch die Latenzzeit für blockierte Vorgänge reduzieren) - dies wäre nur eine Änderung von v2, beachten Sie
3
Marc Gravell

Faule Verbindung

Stellen Sie als bewährte Methode sicher, dass Sie das folgende Muster verwenden, um eine Verbindung zum StackExchange Redis-Client herzustellen:

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

public static ConnectionMultiplexer Connection {
    get {
        return lazyConnection.Value;
    }
}

Wenn das obige nicht funktioniert, werden in Source 1 weitere Debugging-Routen beschrieben, die sich auf Region, Bandbreite und NuGet-Paketversionen beziehen.

IO-Threads

Eine andere Option könnte darin bestehen, die minimalen IO - Threads zu erhöhen. Es wird häufig empfohlen, den minimalen Konfigurationswert für IOCP- und WORKER-Threads auf einen höheren Wert als den Standardwert festzulegen. Es gibt keine einheitliche Anleitung, wie dieser Wert aussehen soll, da der richtige Wert für eine Anwendung für eine andere Anwendung zu hoch/zu niedrig ist. Ein guter Startplatz ist 200 oder 300, dann testen und nach Bedarf Tweak.

So konfigurieren Sie diese Einstellung:

  • Verwenden Sie in ASP.NET die Konfigurationseinstellung minIoThreads unter dem Konfigurationselement <processModel> in machine.config. Laut Microsoft können Sie diesen Wert nicht pro Site ändern, indem Sie Ihre web.config bearbeiten (auch wenn Sie dies früher tun konnten). Der Wert, den Sie hier auswählen, ist der Wert, den alle Ihre .NET-Sites verwenden. Beachten Sie, dass Sie nicht jede Eigenschaft hinzufügen müssen, wenn für autoConfig der Wert false festgelegt ist. Es genügt, autoConfig="false" zu setzen und den Wert zu überschreiben: <processModel autoConfig="false" minIoThreads="250" />

Wichtiger Hinweis: Der in diesem Konfigurationselement angegebene Wert ist eine Einstellung pro Kern. Wenn Sie beispielsweise eine 4-Kern-Maschine haben und möchten, dass Ihre minIOThreads-Einstellung zur Laufzeit 200 beträgt, verwenden Sie <processModel minIoThreads="50"/>.

Quellen:

  1. Microsoft Azure - Untersuchen von Timeout-Ausnahmen in StackExchange.Redis für Azure Redis-Cache
  2. StackExchange.Redis
3
janniks

Lassen Sie den Netzwerkverkehrsmonitor einschalten, um das blip zu bestätigen oder abzulehnen. Haben Sie eine Lösung für das Problem, aber eine grobe. Option 1 - Starten Sie das Managed Redis-System in Azure neu.

0
Srini Sydney

Ich vermute, dass es ein Problem mit der Netzwerkstabilität gibt - also die Timeouts.

Da niemand eine Erhöhung der responseTimeout erwähnt hat, würde ich damit rumspielen. Der Standardwert ist 50ms, der leicht erreicht werden kann. Ich würde es um 200ms versuchen, um zu sehen, ob das mit den Nachrichten helfen würde.

Aus den Konfigurationsoptionen entnommen :

responseTimeout={int}   ResponseTimeout     SyncTimeout     Time (ms) to decide whether the socket is unhealthy

Auf github gibt es mehrere Probleme. Alles, was dies alles ist, ist wahrscheinlich # 871 Das Rollup-Problem "Netzwerkstabilität"/2.0/"Pipelines"

Noch etwas: Hast du versucht, mit ConnectionMultiplexer.ConnectAsync() herumzuspielen anstatt mit ConnectionMultiplexer.Connect()?

0
tukan