StackExchange.Redis超时

Tom*_*len 15 timeout azure redis stackexchange.redis

生产环境在Azure上,使用Redis Cache Standard 2.5GB.

例1

System.Web.HttpUnhandledException(0X80004005):类型System.Web.HttpUnhandledException'引发的异常.---> StackExchange.Redis.RedisTimeoutException:超时执行SETNX User.313123,inst:49,mgr:无效,错误:从不,队列:0,qu:0,qs:0,qc:0,wr:0,wq :0,in:0,ar:0,clientName:PRD-VM-WEB-2,serverEndpoint:Unspecified/Construct3.redis.cache.windows.net:6380,keyHashSlot:15649,IOCP:(Busy = 0,Free = 1000,Min = 1,Max = 1000),WORKER :( Busy = 1,Free = 32766,Min = 1,Max = 32767)(请查看本文,了解可能导致超时的一些常见客户端问题: http://stackexchange.github.io/StackExchange.Redis/Timeouts)在StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl [T](消息消息,ResultProcessor 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在C 1级的处理器,ServerEndPoint服务器):\代码\ StackExchange.Redis\StackExchange. Redis\StackExchange\Redis\RedisBase.cs:第81行

例2

StackExchange.Redis.RedisTimeoutException:超时执行GET ForumTopic.33831,inst:1,mgr:无效,错误:从不,队列:2,qu:0,qs:2,qc:0,wr:0,wq:0,in :0,ar:0,clientName:PRD-VM-WEB-2,serverEndpoint:Unspecified/Construct3.redis.cache.windows.net:6380,keyHashSlot:5851,IOCP:(Buzy = 0,Free = 1000,Min = 1,Max = 1000),WORKER :( Busy = 1,Free = 32766,Min = 1,Max = 32767)(请查看本文,了解一些可能导致超时的常见客户端问题: http:// stackexchange.github.io/StackExchange.Redis/Timeouts)在StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl [T](消息消息,ResultProcessor 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在C 1级的处理器,ServerEndPoint服务器):\代码\ StackExchange.Redis\StackExchange.Redis\StackExchange\Redis的\ RedisBase.cs:在StackExchange.Redis.RedisDatabase.StringGet(RedisKey键,的commandflags标志在c)中管线81:\代码\ StackExchange.Redis\StackExchange.Redis\StackExchange\Redis的\ RedisDatabase.cs:线1647在C3. Code.Controls.Application.Caching.Distributed.Distribu tedCacheController.Get [T](String cacheKey)位于C:\ Construct.net\Source\C3Alpha2\Code\Controls\Application\Caching\Distributed\DistributedCacheController.cs:第115行,位于C3.Code.Controls.Application.Caching.Manager .Manager.Get [T](String key,Func`1 getFromExternFunction,Boolean skipLocalCaches)位于C:\ Construct.net\Source\C3Alpha2\Code\Controls\Application\Caching\Manager\Manager.cs:C3处的第159行. PageControls.Forums.TopicRender.Page_Load(对象发件人,EventArgs e)如C:\ Construct.net \源\ C3Alpha2\PageControls \论坛\ TopicRender.ascx.cs:线40在System.Web.UI.Control.OnLoad(EventArgs的e)上System.Web.UI.Control.LoadRecursive()在System.Web.UI.Control.LoadRecursive()在System.Web.UI.Control.LoadRecursive()在System.Web.UI.Control.LoadRecursive()在System.Web.UI.Control.LoadRecursive()在System.Web.UI.Control.LoadRecursive()在System.Web.UI.Control.LoadRecursive()在System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint )

这些错误是零星的,一天几次.

这是一个Azure网络短信,还是我可以减少的东西?查看错误中的数字似乎没有任何异常,并且Azure报告的服务器负载似乎永远不会超过7%.

Redis连接

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;
    }
Run Code Online (Sandbox Code Playgroud)

jan*_*iks 6

惰性连接

\n\n

最佳实践是确保您使用以下模式连接到 StackExchange Redis 客户端:

\n\n
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => {\n    return ConnectionMultiplexer.Connect("cachename.redis.cache.windows.net,ssl=true,abortConnect=false,password=password");\n});\n\npublic static ConnectionMultiplexer Connection {\n    get {\n        return lazyConnection.Value;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果上述方法不起作用,源 1中描述了更多调试路线,涉及区域、带宽和 NuGet 包版本等。

\n\n

IO线程

\n\n

另一种选择是增加最小 IO 线程数。它\xe2\x80\x99s通常建议将IOCP和WORKER线程的最小配置值设置为大于默认值。对于该值应该是什么,没有一刀切的指导,因为一个应用程序的正确值对于另一应用程序来说可能太高/太低。一个好的起点是 200 或 300,然后根据需要进行测试和调整。

\n\n

如何配置此设置:

\n\n
    \n
  • ASP.NET中,使用machine.config 中配置元素minIoThreads下的配置设置<processModel>。根据 Microsoft 的说法,您可以通过编辑 web.config 来更改每个站点的此值(即使您过去可以这样做),因此您在此处选择的值是所有 .NET 的值网站会使用。请注意,如果您将 autoConfig 设置为 false,则\xe2\x80\x99 不需要添加每个属性,只需放置autoConfig="false"并覆盖该值就足够了:\n<processModel autoConfig="false" minIoThreads="250" />
  • \n
\n\n
\n

重要提示:此配置元素中指定的值是每个核心的设置。例如,如果您有一台 4 核计算机,并且希望运行时的 minIOThreads 设置为 200,则可以使用<processModel minIoThreads="50"/>.

\n
\n\n
    \n
  • 在 ASP.NET 之外,使用ThreadPool.SetMinThreads() API。
  • \n
  • .Net Core中,根据环境/注册表配置旋钮ThreadPool.SetMinThreads()添加环境变量 COMPlus_ThreadPool_ForceMinWorkerThreads 来覆盖默认的 MinThreads 设置 - 您也可以使用与上述相同的方法。
  • \n
\n\n

资料来源:

\n\n
    \n
  1. Microsoft Azure - 调查 Azure Redis 缓存的 StackExchange.Redis 中的超时异常
  2. \n
  3. StackExchange.Redis
  4. \n
\n

  • 为什么不在Asp net(框架)中使用ThreadPool.SetMinThreads()? (2认同)

Mar*_*ell 6

有 3 种情况会导致超时,并且很难知道哪个在起作用:

  1. 图书馆被绊倒了;特别是,存在与 TLS 实现以及我们如何处理 v1.* 版本库中的读取循环相关的已知问题 - 我们为 v2.*投入了大量时间(但是:它不是更新到 v2 总是微不足道的,尤其是当您将该库用作依赖于特定版本的其他代码的一部分时)
  2. 服务器/网络被绊倒;这是一个非常真实的可能性 - 如果它是服务器端,查看“slowlog”会有所帮助,但我没有任何可见性
  3. 服务器和网络都很好,图书馆正在尽其所能,但是客户端和服务器之间有一些巨大的斑点在延迟其他操作;这一点是我确定在修改的帮助,现在,如果这个节目本身是一个常见的问题,我们也许看更好地利用并发连接(不增加带宽,但可以减少延迟对于被阻止的操作) - 这将是一个 v2 唯一的变化,注意