Stackexchange.Redis timeouts & socketfailures

J’utilise Azure Redis (à l’aide de Stackexchange.Redis) en tant que mémoire cache et que cela fonctionne généralement bien. Mais je reçois parfois des erreurs de délais d’attente et je ne peux pas expliquer pourquoi cela se produit.

Mes parameters de connexion redis:

value="dev.redis.cache.windows.net,ssl=true,password=secret,abortConnect=false,syncTimeout=3000" 

Je reçois toutes ces exceptions dans la même seconde (plusieurs appels): [Je les reçois également pour les opérations GET. Presque toutes ces exceptions sont sur SsortingngSet & SsortingngGet. J’ai rarement des exceptions sur HashSets ou HashGets]

 Timeout performing SET {key}, inst: 1, mgr: ExecuteSelect, queue: 6, qu=0, qs=6, qc=0, wr=0/0, in=0/0 SocketFailure on SET SocketFailure on SET No connection is available to service this operation: SET 

Je suppose que la configuration de l’object prend plus de temps que prévu, cela pourrait être dû au fait que l’object est grand et que je pourrais donc potentiellement augmenter le temps de synchronisation, mais est-ce que cela dissimulerait un autre problème?

Je ne reçois ces exceptions que sur les appels synchrones à stackexchange.redis. Je n’ai pas vu d’exception lorsque l’appel est asynchrone.

Trace de la stack:

 StackExchange.Redis.RedisConnectionException: SocketFailure on SET at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) i at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) at StackExchange.Redis.RedisDatabase.SsortingngSet(RedisKey key, RedisValue value, Nullable`1 expiry, When when, CommandFlags flags) at calling method 

Edit: J’utilise le package StackExchange.Redis 1.0.414 et j’utilise MessagePack pour sérialiser mes objects

Les délais d’attente sont généralement causés par l’une des choses suivantes. Voici quelques exemples

  1. CPU client ou serveur atteignant 100%
  2. Paramètres ThreadPool mal configurés, associés à des rafales de trafic
  3. Les clients qui envoient des commandes coûteuses au serveur.
  4. Utiliser au maximum votre bande passante réseau (sur le client ou sur le serveur)

Conseils pour les problèmes liés au client: https://gist.github.com/JonCole/db0e90bedeb3fc4823c2

Conseils pour les problèmes liés au serveur: https://gist.github.com/JonCole/9225f783a40564c9879d

Je recommanderais également de passer à une version plus récente de StackExchange.Redis. La version 1.1.603 contient des informations de diagnostic plus détaillées dans le message d’erreur de délai d’attente qui peuvent vous aider à identifier certains des problèmes courants côté client que j’ai énumérés ci-dessus.

En ce qui concerne les échecs de socket, voici quelques causes courantes de chutes de connexion entre le client et le serveur que j’ai vus:

  1. Mise à l’échelle du client: j’ai constaté de brefs problèmes de connectivité côté client lors de la mise à l’échelle des applications client dans Azure.
  2. Lorsque Redis est corrigé, il y aura des problèmes de connexion. Les correctifs Azure Redis sont expliqués ici: https://gist.github.com/JonCole/317fe03805d5802e31cfa37e646e419d