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. UVa 10828 Back to Kernighan-Ritchie (数学期望 + 高斯消元)

    题意:给定一个 n 个结点的有向图,然后从 1 结点出发,从每个结点向每个后继结点的概率是相同的,当走到一个没有后继结点后,那么程序终止,然后问你经过每个结点的期望是次数是多少. 析:假设 i 结点的 ...

  2. Event.target和Event.currentTarget的区别

    <style> * { margin:0; padding:0; list-style:none; } #ul { width:400px; height:250px; margin:0 ...

  3. ThinkPHP3.2.3:使用模块映射隐藏后台真实访问地址

    例如:项目应用目录/Application下模块如下,默认后台模块为Admin 现在需要修改后台模块的访问地址,以防被别有用心的人很容易就猜到,然后各种乱搞... (在公共配置文件/Applicati ...

  4. Codeforces Round#413 Div.2

    A. Carrot Cakes 题面 In some game by Playrix it takes t minutes for an oven to bake k carrot cakes, al ...

  5. Windows窗口消息大全

    ////////////////////////////////////////////////////////////////////////// #include "AFXPRIV.H& ...

  6. hibernate增删改

    public class HibernateUtils { private static SessionFactory sessionFactory=null; static{ //获取config ...

  7. noip第21课作业

    1. 遍历二叉树 [问题描述] 以先序的方式建立一棵二叉树,空结点用‘#’号表示,例如:abd###ce##f##,将建立一棵如下的二叉树: 输出其中序序列和后序序列,其中总结点个数不超过100. 输 ...

  8. 《mysql必知必会》学习_第五章_20180730_欢

    使用的工具是wamp的Mysql. P29 select prod_name from products;  #在表products中选列prod_name,顺寻不是纯粹的随机,但是没有说明排列顺序, ...

  9. java 图片压缩 缩放

    废话不多说,直接上代码,静态方法可直接调用,中间用流来处理的 /** * 图片缩放(未考虑多种图片格式和等比例缩放) * @param filePath 图片路径 * @param height 高度 ...

  10. (使用STL自带的排序功能进行排序7.3.2)POJ 2092 Grandpa is Famous(结构体排序)

    /* * POJ_2092.cpp * * Created on: 2013年11月1日 * Author: Administrator */ #include <iostream> #i ...