web-dev-qa-db-fra.com

Délai d'attente StackExchange.Redis

L'environnement de production est sur Azure, à l'aide de Redis Cache Standard 2.5GB.

Exemple 1

System.Web.HttpUnhandledException (0x80004005): Exception de type 'System.Web.HttpUnhandledException' a été lancé. ---> StackExchange.Redis.RedisTimeoutException: délai d'attente pour l'exécution de SETNX User.313123, inst: 49, mgr: inactif, err: jamais, file d'attente: 0, qu: 0, qs: 0, qc: 0, wr: 0, wq: 0, dans: 0, ar: 0, clientName: PRD-VM-WEB-2, serverEndpoint: Unspecified/Construct3.redis.cache.windows.net: 6380, keyHashSlot: 15649, IOCP: (Occupé = 0, Gratuit = 1000, Min = 1, Max = 1000), TRAVAILLEUR: (Occupé = 1, Gratuit = 32766, Min = 1, Max = 32767) (Veuillez jeter un coup d'œil à cet article Pour résoudre certains problèmes courants côté client pouvant entraîner des délais d'attente: http: // stackexchange .github.io/StackExchange.Redis/Timeouts ) à StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl [T] (Message Message, ProcesseurProcesseur1 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, serveur ServerEndPoint) dans c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\RedisBase.cs: line 81

Exemple 2

StackExchange.Redis.RedisTimeoutException: délai d'attente pour l'exécution de GET ForumTopic.33831, inst: 1, mgr: inactif, err: jamais, file d'attente: 2, qu: 0, qs: 2, qc: 0, wr: 0, wq: 0, dans: 0, ar: 0, clientName: PRD-VM-WEB-2, serverEndpoint: Unspecified/Construct3.redis.cache.windows.net: 6380, keyHashSlot: 5851, IOCP: (Occupé = 0, Gratuit = 1000, Min = 1, Max = 1000), TRAVAILLEUR: (Occupé = 1, Gratuit = 32766, Min = 1, Max = 32767) (Veuillez jeter un coup d'œil à cet article Pour résoudre certains problèmes courants côté client pouvant entraîner des délais d'attente: http: // stackexchange .github.io/StackExchange.Redis/Timeouts ) à StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl [T] (Message Message, ProcesseurProcesseur1 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, serveur ServerEndPoint) dans c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\RedisBase.cs: line 81 sur StackExchange.Redis.RedisDatabase.StringGet (clé RedisKey, drapeaux CommandFlags) dans c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\RedisDatabase.cs: line 1647 à C3.Code.Controls.Application.Caching.Distributed.DistributedCacheController.Get [T] (String CacheKey) dans C:\Construct.net\Source\C3Alpha2\Code\Controls\Application\Caching\Distributed\DistributedCacheController.cs: line 115 at C3.Code.Controls.Application.Caching.Manager.Manager.Get [T] (String Key, Func`1 getFromExternFunction, Boolean skipLocalCaches) dans C:\Construct.net\Source\C3Alpha2\Code\Controls\Application\Caching\Manager\Manager.cs: line 159 sur C3.PageControls.Forums.TopicRender.Page_Load (Expéditeur d'objet, EventArgs e) dans C:\Construct.net\Source\C3Alpha2\PageControls\Forums\TopicRender.ascx.cs: line 40 sur System.Web.UI.Control.OnLoad (EventArgs e) sur System.Web.UI.Control.LoadRecursive () à l'adresse System.Web.UI.Control.LoadRecursive () à l'adresse System.Web.UI.Control.LoadRecursive () à l'adresse System.Web.UI.Control.LoadRecursive () à l'adresse System.Web.UI.Control.LoadRecursive () à l'adresse System.Web.UI.Control.LoadRecursive () à l'adresse System.Web.UI.Control.LoadRecursive () à l'adresse System.Web.UI.Page.ProcessRequestMain (Boolean IncludeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Ces erreurs sont sporadiques, plusieurs fois par jour.

S'agit-il d'un blip de réseau Azure, ou de quelque chose que je peux réduire? L'examen des chiffres de l'erreur ne semble rien sortir de l'ordinaire, et la charge du serveur ne semble jamais dépasser 7%, comme l'a signalé Azure.

Redis connection

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

Connexion paresseuse

Il est recommandé d’utiliser le modèle suivant pour vous connecter au client StackExchange Redis:

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

Si ce qui précède ne fonctionne pas, d'autres itinéraires de débogage sont décrits dans Source 1 , notamment en ce qui concerne les versions de la région, de la bande passante et des packages NuGet.

Fils d'E/S

Une autre option pourrait être d'augmenter le nombre minimal de threads IO. Il est souvent recommandé de définir une valeur supérieure à la valeur par défaut pour la configuration minimale des threads IOCP et WORKER. Il n'y a pas d'indication uniforme sur ce que devrait être cette valeur, car la valeur correcte pour une application sera trop élevée/trop basse pour une autre application. Un bon point de départ est 200 ou 300, puis testez et modifiez au besoin.

Comment configurer ce paramètre:

  • Dans ASP.NET, utilisez le paramètre de configuration minIoThreads sous l'élément de configuration <processModel> dans machine.config. Selon Microsoft, vous ne pouvez pas modifier cette valeur par site en modifiant votre fichier web.config (même si vous pouviez le faire auparavant). La valeur que vous choisissez ici correspond donc à la valeur utilisée par tous vos sites .NET. Notez que vous n’aurez pas besoin d’ajouter toutes les propriétés si autoConfig est défini sur false. Il suffit de mettre autoConfig="false" et de surcharger la valeur: <processModel autoConfig="false" minIoThreads="250" />

Remarque importante: la valeur spécifiée dans cet élément de configuration est un paramètre par cœur. Par exemple, si vous avez une machine 4 cœurs et souhaitez que votre paramètre minIOThreads soit de 200 au moment de l'exécution, vous utiliseriez <processModel minIoThreads="50"/>.

Sources:

  1. Microsoft Azure - Enquête sur les exceptions de délai d'attente dans StackExchange.Redis pour le cache Azure Redis
  2. StackExchange.Redis
3
janniks

Laissez le moniteur de trafic réseau activé pour confirmer/refuser le blip.avoir une solution à la question, mais une solution brute. Option 1: essayez de redémarrer l'instance gérée dans Azure.

0
Srini Sydney

Mon hypothèse est qu'il y a un problème de stabilité du réseau - d'où les délais d'attente.

Étant donné que personne n’a mentionné une augmentation de la variable responseTimeout, je la ferais jouer. La valeur par défaut est 50ms, facilement accessible. Je l'essayerais environ 200ms pour voir si cela aiderait avec les messages.

Tiré des options de configuration :

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

Plusieurs problèmes ont été ouverts à ce sujet sur github. Celui qui combine le tout est probablement # 871 Problème de cumul avec la "stabilité du réseau"/2.0/- "pipelines"

Une dernière chose: avez-vous essayé de jouer avec ConnectionMultiplexer.ConnectAsync() à la place de ConnectionMultiplexer.Connect()?

0
tukan