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, ProcesseurProcesseur
1 processor, ServerEndPoint server) in c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 2120 at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor
1, 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, ProcesseurProcesseur
1 processor, ServerEndPoint server) in c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 2120 at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor
1, 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;
}
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.
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:
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"/>
.
ThreadPool.SetMinThreads()
comme décrit ci-dessus.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.
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()
?