Azure Redis 缓存 - GET 调用超时

2024-03-18

我们在 Azure 中有多个 Web 和辅助角色通过 StackExchange.Redis 库连接到我们的 Azure Redis 缓存,并且我们经常收到超时,这使得我们的端到端解决方案陷入停滞。其中之一的示例如下:

System.TimeoutException:执行 GET 流超时:459,实例:4, mgr:非活动状态,队列:12,qu=0,qs=12,qc=0,wr=0/0,in=65536/0 StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](消息 消息、结果处理器1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\58bc9a6df18a3782\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 1785 at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor1 个处理器,ServerEndPoint 服务器)中 c:\TeamCity\buildAgent\work\58bc9a6df18a3782\StackExchange.Redis\StackExchange\Redis\RedisBase.cs:行 79 在 StackExchange.Redis.RedisDatabase.StringGet(RedisKey key, CommandFlags 标志)中 c:\TeamCity\buildAgent\work\58bc9a6df18a3782\StackExchange.Redis\StackExchange\Redis\RedisDatabase.cs:行 1346 于 OptiRTC.Cache.RedisCacheActions.c__DisplayClass41.<Get>b__3() in c:\dev\OptiRTCAzure\OptiRTC.Cache\RedisCacheActions.cs:line 104 at Polly.Retry.RetryPolicy.Implementation(Action action, IEnumerable1 shouldRetryPredicates,Func`1policyStateFactory) at OptiRTC.Cache.RedisCacheActions.Get[T](字符串键,布尔值 允许脏读)中 c:\dev\OptiRTCAzure\OptiRTC.Cache\RedisCacheActions.cs:第 107 行 OptiRTC.Cache.RedisCacheAccess.d__e4.MoveNext() 在 c:\dev\OptiRTCAzure\OptiRTC.Cache\RedisCacheAccess.cs 中:第 1196 行; TraceSource“WaWorkerHost.exe”事件

所有超时都有不同的队列和 qs 编号,但其余消息是一致的。这些 StringGet 调用跨越缓存中的不同键。在我们的每个服务中,我们使用单例缓存访问类和单个 ConnectionMultiplexer,该 ConnectionMultiplexer 在 Web 或辅助角色启动中注册到我们的 IoC 容器:

        container.RegisterInstance<ICacheAccess>(cacheAccess);

在 ICacheAccess 的实现中,我们按如下方式创建多路复用器:

            ConfigurationOptions options = new ConfigurationOptions();
            options.EndPoints.Add(serverAddress);
            options.Ssl = true;
            options.Password = accessKey;                    
            options.ConnectTimeout = 1000;
            options.SyncTimeout = 2500;

            redis = ConnectionMultiplexer.Connect(options);

其中 redis 对象在整个实例中使用。我们有大约 20 个 Web 和辅助角色实例通过此 ICacheAccess 实现连接到缓存,但管理控制台显示平均有 200 个到缓存的并发连接。

我看过其他引用使用 StackExchange.Redis 版本 1.0.333 的帖子,我们是通过 NuGet 进行的,但是当我查看添加的 StackExchange.Redis.dll 引用的实际版本时,它显示为 1.0.316.0。我们尝试添加和删除 NuGet 引用以及将其添加到新项目中,但总是出现版本差异。

任何见解将不胜感激。谢谢。

附加信息:

我们已升级至 1.0.371。我们有两个服务,每个服务以不同的时间间隔访问同一缓存对象,一个用于编辑并偶尔读取,另一个服务每秒多次读取该对象。这两个服务都使用相同的缓存代码和 StackExchange.Redis 库版本进行部署。我几乎从未在编辑对象的服务中看到超时,但在读取对象的服务中,有 50% 到 75% 的时间出现超时。超时的格式与上面所示的相同,并且在将 db.StringGet 调用包装在 Polly 重试块中后,它们会继续发生,该块处理 RedisException 和 System.TimeoutException 并在 500 毫秒后重试一次。

我们就这个问题联系了 Microsoft,他们确认在 Redis 日志中没有看到任何表明 Redis 服务端存在问题的内容。我们的缓存未命中百分比在 Redis 服务器上非常低,但我们仍然遇到这些超时,这极大地阻碍了我们应用程序的功能。

作为对评论的回应,是的,我们总是在 qs 中有一个数字,而在 qc 中从来没有。我们总是在第一部分有一个数字,而在第二部分却没有。

更多附加信息:

当我在较高的 CPU 上运行具有较少实例的服务时,与在较低的 CPU 上运行实例时相比,我收到的超时错误明显更多。更具体地说,我今天早上从我们的服务中提取了一些数据。当它们以大约 30% CPU 运行时,我发现很少有超时问题 - 30 分钟内只有 42 个。当我删除一半实例并且它们开始以大约 60-65% 的 CPU 运行时,速度在 30 分钟内增加了 10 倍,达到 536。


我知道这个帖子已经有几个月了,但我认为我自己的经验可以在这里增加一些价值。我在使用 Azure Redis 缓存时也遇到了同样的问题(Get 超时),但我意识到这几乎完全发生在字符串值相对较大(长度> 250K)的 Get 上。我在 Gets 和 Sets 上都实现了 gzip(当字符串值很大时),现在我几乎从未遇到超时。

即使这不能解决您的特定问题,通常压缩这些值以降低成本并提高性能也可能是一个很好的做法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Azure Redis 缓存 - GET 调用超时 的相关文章

随机推荐

  • 在Java中,如何在数组中存储大数字?

    在Java中 如何将数字存储在数组中 我的意思是非常长的数字 例如高达1万亿 这样我就可以访问它们并用文字打印出它们是什么 1万亿不是that大 只需使用一个long 它可以存储大至 9223372036854775807 超过五亿 的数字
  • 查询 Pandas 中的 NaN 和其他名称

    假设我有一个数据框df有一个柱子value保存一些浮点值和一些NaN 我怎样才能获得我们拥有的数据框部分NaN 使用查询语法 例如 以下内容不起作用 df query value lt 10 or value NaN I get name
  • 更改 django models related_name 属性是否需要向南迁移?

    我有一个带有外键的简单 django 模型 class FooModel models Model foo models ForeignKey Foo related name foo choices bar models CharFiel
  • 在 Webpack 中加载静态 JSON 文件

    我的代码中有以下构造 var getMenu function return window fetch portal content json menu json then function data return data json 我尝
  • python pack 4字节整数,字节数组位于bytearray struct.pack中

    我正在尝试使用 struct pack 将 python bytearray 的内容打包为 4byte 有符号整数 不幸的是 pack 想要一个字符串 所以经过一番谷歌搜索后 我认为我需要将字节数组解码为字符串 我认为 ascii 的意思是
  • 通过 API GW 调用时,AWS Lambda Go 函数未获取请求正文

    首先 有人可能会说这个问题非常类似于HTTP 请求正文无法通过 AWS API Gateway 访问 AWS lambda 函数 https stackoverflow com questions 41059440 http request
  • 集合removeAll忽略大小写?

    好的 这是我的问题 我必须HashSet的 我用的是removeAll方法从一组中删除存在于另一组中的值 在调用该方法之前 我显然将这些值添加到Sets 我打电话 toUpperCase 在各个String在添加之前 因为两个列表中的值的情
  • 显示菜单使光标消失

    单击时光标消失 如下所示 如何重现 获取 Game Jam 菜单模板 https www assetstore unity3d com en content 40465 https www assetstore unity3d com en
  • 如何完全反汇编Python源代码

    我一直在玩dis库来反汇编一些Python源代码 但我发现这不会递归到函数或类中 import dis source py test py with open source py as f source source code f sour
  • 打开工作表时自动执行的宏

    我的宏 update 是否有可能在每次打开 Excel 文件时自动执行 下面的代码不能很好地工作 谢谢 Private Sub Workbook Open Run update End Sub Option Explicit Sub upd
  • Google Sheets 调试无休止的计算和缓慢的加载时间(Chrome 开发工具)

    使用 Google 表格 随着时间的推移 它的复杂性和大小都在增长 现在正在无休止地计算 而且打开速度非常慢 该工作表包含大量数据 公式和导入范围 我已阅读有关如何加快工作表速度的最佳实践link https www benlcollins
  • 将 Fogbugz 与 TortoiseSVN 集成,无需 URL/Subversion 后端

    我已经安装了 TotroiseSVN 并且大部分存储库都从 C subversion 签入和签出以及一些从网络共享签入和签出的情况 当我最初发布这个问题时我忘记了这一点 这意味着我本身没有 颠覆 服务器 如何集成 TortoiseSVN 和
  • 为什么我收到错误“该类型的方法未定义”?

    我正在大学学习基础知识 希望获得有关 Eclipse 中以下错误的帮助 The method getCost is undefined for the type ShopCLI Exception in thread main java l
  • 在 Objective-C 中以编程方式计算 IRR(内部利率回报)和 NPV

    我正在开发一个金融应用程序并需要IRR in built functionality of Excel 计算并发现了如此好的教程C here http www codeproject com Tips 461049 Internal Rat
  • WPF 分隔符位置

    我正在使用分隔符在边框内绘制一条垂直线 起初这没问题 因为线条需要居中 但现在我需要将其定位在距左边框的自定义 x 位置 有没有办法做到这一点
  • 如何在 PyPI 中包含非 .py 文件?

    我是 PyPI 的新手 所以让我符合这一点 我试图在 PyPI 上放置一个包 但当我尝试使用 pip 安装它时遇到了一些麻烦 当我将文件上传到 PyPI 时 我收到一条警告 但 setup py 脚本完成时没有出现致命错误和 200 状态
  • 在 HLSL 中绘制超级椭圆

    更新 关于如何使用超级公式绘制一个的答案在最后 I need to draw a rounded rectangle such as this one using a SuperEllipse http en wikipedia org w
  • 如何在 chrome 扩展的选项页面和背景页面之间进行通信

    我面临一个问题 通过消息传递 我将 DOM 数据从内容脚本传输到后台页面 我想知道的是如何在选项页面和后台页面之间建立通信通道 应用程序编程接口chrome extension getBackgroundPage 没有用 传统的消息传递也不
  • Windows批处理脚本获取当前驱动器名称

    我有一个批处理文件 位于 USB 密钥上 我需要知道批次所在的驱动器名称 例如 如果它是 E mybatch bat 则打开时应该找到 E 与 F G 等相同的内容 我怎样才能在批处理脚本中做到这一点 视窗 CD 这就是您正在寻找的 它打印
  • Azure Redis 缓存 - GET 调用超时

    我们在 Azure 中有多个 Web 和辅助角色通过 StackExchange Redis 库连接到我们的 Azure Redis 缓存 并且我们经常收到超时 这使得我们的端到端解决方案陷入停滞 其中之一的示例如下 System Time