我们有一个使用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)
答案 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" />