StackExchange.Redis 使用名为 synctimeout 的配置设置进行同步操作,该设置的默认值为 1000 毫秒。 如果同步调用未在规定时间内完成,StackExchange.Redis 客户端会引发类似于以下示例的超时错误。

System.TimeoutException: Timeout performing MGET 2728cc84-58ae-406b-8ec8-3f962419f641, inst: 1,mgr: Inactive, queue: 73, qu=6, qs=67, qc=0, wr=1/1, in=0/0 IOCP: (Busy=6, Free=999, Min=2,Max=1000), WORKER (Busy=7,Free=8184,Min=2,Max=8191)

此错误消息中包含的指标可以指出问题的原因和可能的解决方法。 下表包含有关错误消息指标的详细信息。

错误消息指标 详细信息
inst 在上一个时间片中:发出了 0 个命令
mgr 套接字管理器正在执行 socket.select,也就是说,它在请求 OS 指示一个需要执行某些操作的套接字;大致说来:读取器并没有主动从网络读取内容,因为它认为不需执行任何操作
队列 总共有 73 个正在进行的操作
qu 正在进行的操作中,有 6 个操作位于未发送队列中,尚未写入到出站网络
qs 正在进行的操作中,有 67 个操作已发送给服务器,但尚未得到响应。 响应可能为 Not yet sent by the server 或 sent by the server but not yet processed by the client.
qc 正在进行的操作中,有 0 个操作已经有回复,但尚未标记为完成,因为正在完成循环中进行等待
wr 存在活动的写入器(这意味着系统不会忽略这 6 个尚未发送的请求)字节/活动写入器
位于 没有活动的读取器,NIC 字节/活动读取器上没有可供读取的字节

有关线程池增长的重要详细信息

CLR 线程池具有两种类型的线程 —“辅助角色”和“I/O 完成端口”(又称为 IOCP)线程。

  • 对于诸如处理 Task.Run(…) 或 ThreadPool.QueueUserWorkItem(…) 方法这类事务,使用辅助角色线程。 需要在后台线程上进行工作时,CLR 中的各种组件也会使用这些线程。
  • 进行异步 IO(例如从网络进行读取)时,使用 IOCP 线程。

线程池按需提供新的辅助角色线程或 I/O 完成线程(没有任何限制),直到它达到每种线程类型的“最小值”设置。 默认情况下,最小线程数设置为系统上的处理器数。

一旦现有(忙碌)线程数达到“最小”线程数,线程池便会将插入新线程的速率限制为每 500 毫秒一个线程。 通常,如果系统中出现需要 IOCP 线程的突发工作,则它会非常快速地处理该工作。 但是,如果突发工作多于配置的“最小值”设置,则在处理某些工作时会出现一定的延迟,因为线程池会等待发生以下两种情况之一。

  1. 一个现有线程释放,以便处理工作。
  2. 在 500 毫秒内没有任何现有线程释放,因此会创建一个新线程。

基本上,这意味着忙碌线程数大于最小线程数,在应用程序处理网络流量之前可能需要付出 500 毫秒延迟。 此外请务必注意,当现有线程保持空闲状态的时间超过 15 秒(基于我记得的内容)时,会清理它,并且这种增长和收缩的循环可能会重复。

如果我们考虑一个来自 StackExchange.Redis(内部版本 1.0.450 或更高版本)的示例错误消息,会看到它现在会打印线程池统计信息(请参阅下面的 IOCP 和辅助角色详细信息)。

System.TimeoutException: Timeout performing GET MyKey, inst: 2, mgr: Inactive,
queue: 6, qu: 0, qs: 6, qc: 0, wr: 0, wq: 0, in: 0, ar: 0,
IOCP: (Busy=6,Free=994,Min=4,Max=1000),
WORKER: (Busy=3,Free=997,Min=4,Max=1000)

在前面的示例中,可以看到对于 IOCP 线程有 6 个忙碌线程,而系统配置为允许最少 4 个线程。 在这种情况下,客户端可能会遇到两个 500 毫秒延迟,因为 6 > 4。

请注意,如果 IOCP 或辅助角色线程受到限制,则 StackExchange.Redis 可以会超时。

建议

考虑到此信息,我们强烈建议客户将 IOCP 和辅助角色线程的最小配置值设置为大于默认值。 我们无法提供有关此值应是多少的通用指导,因为一个应用程序的合适值对于另一个应用程序会太高/低。 此设置还可能会影响复杂应用程序其他部分的性能,因此每个客户需要按照其特定需求来微调此设置。 开始时设置为 200 或 300 会比较好,随后可进行测试并根据需要进行调整。

如何配置此设置:

  • 在 ASP.NET 中,可在 web.config 中的 <processModel> 配置元素下使用“minIoThreads”配置设置。如果在 Azure 网站内部运行,则此设置不会通过配置选项进行公开。 但是,应该仍然能够通过 global.asax.cs 中的 Application_Start 方法以编程方式配置此设置置(请参阅下文)。

    备注

    此配置元素中指定的值是按核心设置。 例如,如果使用 4 核计算机,并且希望 minIOThreads 设置在运行时为 200,则使用 <processModel minIoThreads="50"/>

  • 在 ASP.NET 外部,可使用 ThreadPool.SetMinThreads(…) API。

启用服务器 GC,以便在使用 StackExchange.Redis 时在客户端上获取更多吞吐量

启用服务器 GC 可以在使用 StackExchange.Redis 时优化客户端并提供更好的性能和吞吐量。 有关服务器 GC 以及如何启用它的详细信息,请参阅以下文章:

Azure Redis 缓存的 ASP.NET 会话状态提供程序

https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-aspnet-session-state-provider

Redis 缓存的 ASP.NET 输出缓存提供程序

https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-aspnet-output-cache-providerAzure

将 Spring Boot Initializer 应用配置为使用云中的 Redis 和 Azure Redis 缓存

https://docs.microsoft.com/zh-cn/java/azure/spring-framework/configure-spring-boot-initializer-java-app-with-redis-cache

Redis 缓存常见问题

https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-faq

如何排查 Azure Redis 缓存问题

https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-how-to-troubleshoot#client-side-troubleshooting

StackExchange.Redis 最佳做法

https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-faq#stackexchangeredis-best-practices

有关线程池增长的重要详细信息(CLR 线程池具有两种类型的线程 —“辅助角色”和“I/O 完成端口”(又称为 IOCP)线程)

https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-faq#stackexchangeredis-best-practices

StackExchange.Redis 超时异常

https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-how-to-troubleshoot#stackexchangeredis-timeout-exceptions

如何为高级 Azure Redis 缓存配置 Redis 群集功能

https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-how-to-premium-clustering

https://gist.github.com/JonCole/e65411214030f0d823cb

https://docs.microsoft.com/zh-cn/dotnet/standard/garbage-collection/fundamentals

https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-faq#important-details-about-threadpool-growth

https://blog.marsen.me/2016/11/21/aspdotnet_threadpool_and_redis/

Azure Redis 缓存使用注意事项与排查问题文档整理的更多相关文章

  1. 【Azure Redis 缓存 Azure Cache For Redis】Azure Redis由低级别(C)升级到高级别(P)的步骤和注意事项, 及对用户现有应用的潜在影响,是否需要停机时间窗口,以及这个时间窗口需要多少的预估问题

    问题描述 由于Azure Redis的性能在不同级别表现不同,当需要升级/缩放Redis的时候,从使用者的角度,需要知道有那些步骤? 注意事项? 潜在影响?停机事件窗口? 升级预估时间? 解决方案 从 ...

  2. 【Azure Redis 缓存】Azure Redis出现了超时问题后,记录一步一步的排查出异常的客户端连接和所执行命令的步骤

    问题描述 Azure Redis在使用的过程中,多次无规律的出现超时问题.抓取到客户端的异常错误后,想进一步的分析是何原因导致了如下异常呢? Timeout awaiting response (ou ...

  3. 【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能

    问题描述 关于Azure Redis的性能问题,在官方文档中,可以查看到不同层级Redis的最大连接数,每秒处理请求的性能. 基本缓存和标准缓存 C0 (250 MB) 缓存 - 最多支持 256 个 ...

  4. 【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)

    问题描述 Azure Redis和所有的Redis服务一样,可以让你保留存储在Redis中的数据.以防万一在Redis服务器出现故障的时候能尽可能小的减少数据的损失.在Azure Redis服务中,默 ...

  5. 【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功

    问题描述 在正常使用Azure Redis的服务中,突然发现Redis 的CPU达到了100%, 正常的使用中发现性能问题严重.从Redis的门户图表中,观察到CPU, Connection,Lent ...

  6. 【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果

    当使用Azure Redis高级版时候,为了能更好的保护Redis的安全,启用了虚拟网路,把Redis集成在Azure中的虚拟网络,只能通过虚拟网络VENT中的资源进行访问,而公网是不可以访问的.但是 ...

  7. 【Azure Redis 缓存】Azure Redis 服务不支持指令CONFIG

    问题描述 在Azure Redis的门户页面中,通过Redis Console连接到Redis后,想通过CONFIG命令来配置Redis,但是系统提示CONFIG命令不能用. 错误消息为:(error ...

  8. 【Azure Redis 缓存】Linux虚拟机中使用6380端口(SSL方式)连接Azure Redis (redis-cli & stunnel)

    问题描述 在Azure Redis的官方文档中,介绍了在Windows下,如何通过redis-cli.exe连接Redis, 包含如何配置stunnel使得通过 6380,SSL方式连接到Redis ...

  9. 【Azure Redis 缓存】Azure Redis功能性讨论

    关于使用Azure Redis服务在以下九大方面的功能性的解说: 高可用 备份可靠性 配置自动化 部署多样性 快速回档功能 数据扩容 SLA稳定性 数据安全性 监控系统 一:高可用 Azure Cac ...

随机推荐

  1. Arria10 SDI II学习笔记

    12G-SDI16是什么意思? 关于 int_vpid_byte1 int_vpid_byte2 int_vpid_byte3 int_vpid_byte4 这些参数是不是如果外部数据有就不需要传输, ...

  2. 深入浅出javascript(二)函数和this对象

    一.函数对象的属性和方法 函数是一种数据类型,也是对象,这一点很明确.因此,函数对象也可以添加属性和方法,但是这里的属性和方法是静态的,之所以这样说,就是为了区别构造函数. 示例如下: ①创建一个空的 ...

  3. JS库汇总[重要]

    库名称  说明 附加说明 URI 一款js 操作URL的插件 功能十分强大.可以增加 .修改.删除.参数   1.Animate.css 2.Hover.css 3.jQuery 4.WebUploa ...

  4. 爬虫技巧-西瓜视频MP4地址获取

    记录一下西瓜视频MP4地址的获取步骤 目标: 指定西瓜视频地址,如 https://www.ixigua.com/a6562763969642103303/#mid=6602323830,获取其视频M ...

  5. 使用Xshell在Windows系统和Linux系统之间进行文件传输

    版权声明:本文为转载内容. 原博客内容https://blog.csdn.net/love666666shen/article/details/75742077 Windows系统在安装虚拟机cent ...

  6. noah

    1.url:controller/method 2.在index.php中设置display_errors:1 能看到错误提示

  7. 通过mybatis向数据库中插入日期数据

    遇到的问题: 通过mybatis向数据库中插入日期格式数据,发现只有年月日, 没有小时分钟和秒 当你想在实体类中使用java.util.Date类型,而且还想在数据库中保存时分秒时, 解决办法: 你可 ...

  8. unigui导出EXCEL使用NATIVEEXCEL

    unigui导出EXCEL使用NATIVEEXCEL // 需要nativeexcel控件// cxg 2017-9-9 unit myExcel; interface uses System.Sys ...

  9. IDHTTP的基本用法

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  10. UITableView横向滚动

    UITableView 设置 CGRect tableViewRect = CGRectMake(0.0, 0.0, 50.0, 320.0); self.tableView = [[UITableV ...