如何在Azure redis缓存中修复此超时异常?

时间:2016-09-02 15:43:21

标签: c# asp.net azure redis kentico

我们有一个使用Microsoft.Web.Redis.RedisSessionStateProvider作为会话状态提供程序的Web应用程序。直到最近,当应用程序突然报告大量异常时,我们对此没有任何问题,如下所述。

该消息表明某种超时。但我不知道如何解决这个问题。该应用程序是Kentico CMS的一个实例,我们没有以任何方式定制其会话缓存机制。

主要例外:

消息:

  

抛出了'System.Web.HttpException'类型的异常。

堆栈追踪:

at System.Web.HttpAsyncResult.End() 
at System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion(IAsyncResult ar) 

内部异常:

消息:

  

超时执行EVAL,inst:1,mgr:无效,错误:从不,队列:0,qu:0,qs:0,qc:0,wr:0,wq:0,in:0,ar:0 ,IOCP :( Busy = 0,Free = 1000,Min = 2,Max = 1000),WORKER :( Busy = 3,Free = 32764,Min = 2,Max = 32767),clientName:KSCOMAZUATWEB2

堆栈追踪:

at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 1927 
at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\RedisBase.cs:line 80 
at StackExchange.Redis.RedisDatabase.ScriptEvaluate(String script, RedisKey[] keys, RedisValue[] values, CommandFlags flags) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\RedisDatabase.cs:line 866 
at Microsoft.Web.Redis.StackExchangeClientConnection.<>c__DisplayClass4.<Eval>b__3() in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 113 
at Microsoft.Web.Redis.StackExchangeClientConnection.RetryForScriptNotFound(Func`1 redisOperation) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 129 
at Microsoft.Web.Redis.StackExchangeClientConnection.RetryLogic(Func`1 redisOperation) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 155 
at Microsoft.Web.Redis.StackExchangeClientConnection.Eval(String script, String[] keyArgs, Object[] valueArgs) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 113 
at Microsoft.Web.Redis.RedisConnectionWrapper.TryTakeWriteLockAndGetData(DateTime lockTime, Int32 lockTimeout, Object& lockId, ISessionStateItemCollection& data, Int32& sessionTimeout) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisConnectionWrapper.cs:line 182 
at Microsoft.Web.Redis.RedisSessionStateProvider.GetItemFromSessionStore(Boolean isWriteLockRequired, HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:line 272 
at Microsoft.Web.Redis.RedisSessionStateProvider.GetItemExclusive(HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:line 190 
at System.Web.SessionState.SessionStateModule.GetSessionStateItem() 
at System.Web.SessionState.SessionStateModule.PollLockedSessionCallback(Object state) 

2 个答案:

答案 0 :(得分:2)

在遇到同样的问题并阅读了关于设置min&amp;的各种帖子之后最大线程值等,发现问题出在订阅层上。

C1 basic(£35 / GBP mth)拥有1gb缓存,1000个并发连接,这与C1标准层(£95GBP / Mth)完全相同。 这是一个很自然的假设,当你只需要几MB的缓存并且在任何时候只有50个并发会话处于活动状态时,那就是C!基本就足够了,如果不是过度的话。

如果您的网站上有10个或更少的并发用户,则差异似乎是C1 Basic有效。 公平地说,在细则中提到基本只适用于开发和测试环境。

答案 1 :(得分:1)

我刚刚在客户端网站上完成了这项工作,帮助我的是将其添加到提供商的连接字符串中:

throwOnError="true" retryTimeoutInMilliseconds="500"

我所学到的有时会出现延迟问题,如果解析得不够快,则默认只是“退出”。因此添加它可以继续重试。

您的字符串可能如下所示

<add name="MySessionStateStore" throwOnError="true" retryTimeoutInMilliseconds="500" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="mysite-prod.redis.cache.windows.net" accessKey="mykey" ssl="true" />