导致Redis超时(Timeouts)常见问题

标签: redis timeouts 常见问题 | 发表时间:2016-10-26 23:43 | 作者:展示美好
出处:http://www.iteye.com
因实际应用中出现经常 Redis 超时问题,StackExchange.Redis 在 Github 上 Timeouts 一文从多个方面进行分析,并提供相应的解决方案, 为方便日后再次出现该问题时快速查阅,特写下本文作为技术笔记,同时给英文不太好的程序员(媛)提供参考,帮助大家更好的学习redis http://www.maiziedu.com/course/337/。
   对于使用过 StackExchange.Redis 的程序员(媛),经常碰到类似于以下的异常:
  Timeout performing GET keyName, inst: 1, mgr: ExecuteSelect, err: never, queue: 2, qu: 2, qs: 0, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, clientName: computerName, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=4,Free=32763,Min=4,Max=32767), Local-CPU: unavailable (Please take a look at this article for some common client-side issues that can cause timeouts: https://github.com/StackExchange/StackExchange.Redis/tree/master/Docs/Timeouts.md)
  即 Redis 执行超时,原因可能为以下几个方面的问题:
  1、是否被网络、CPU 或内存(RAM)的限制?
  验证客户端和搭建 Redis-Server 的服务器支持的最大带宽是多少。如果有些请求(request)被带宽限制,则它们消耗更长时间才能完成,从而可能导致超时。同样,验证是否被客户端或服务器上的 CPU 限制——这将导致请求等待 CPU 时间,从而超时。 还有更容易被忽略的情况,当 Redis 数据量超过分配的内存(RAM)限制时,发生 Redis 锁死,导致超时。
  2、是否有命令(command)在 Redis 服务器上处理时,消耗很长时间?
  可能有一些命令需要花费很长时间才能在 Redis 服务器上处理,导致请求超时。 长时间运行命令的例子有 mget 大量的键、keys* 或写得不好的 lua 脚本。 您可以运行 SlowLog 命令查看是否有请求花费比预期更长的时间。 关于命令的更多细节可以查看 这里 。
  3、在向Redis发出的几个小请求之前是否有大量请求超时?
  错误消息中的参数 “qs” 告诉您有多少请求从客户端发送到服务器,但尚未响应。 对于某些类型的加载,您可能会看到该值(qs)不断增长,因为 StackExchange.Redis 使用单个 TCP 连接,并且一次只能读取一个响应。 即使第一个操作超时,它也不会停止向(或从)服务器发送数据,其他请求也会被阻塞,直到完成为止, 从而导致超时。 一个解决方案是通过确保 redis-server 满足工作负载的足够大的缓存,并将大值分割为更小的块,来最小化超时机会。 另一个可能的解决方案是在客户端中使用 ConnectionMultiplexer 对象池,并在发送新请求时选择“最少加载” ConnectionMultiplexer, 这将防止单个超时导致其他请求也超时。
  4、在超时异常中,是否看到大量繁忙或繁忙的工作线程?
  让我们先来了解线程池增长的一些细节:
  CLR 线程池有两种类型的线程 —— “工作线程”和“ I/O 完成端口”(I/O Completion Port,又名 IOCP )线程。
  · 工作线程用于类似于处理 Task.Run(……)或 ThreadPool.QueueUserWorkItem(……)方法的东西。 当工作需要在后台线程上发生时,这些线程也被 CLR 中的各种组件使用。
  · 当异步 IO 发生时(例如从网络读取),使用 IOCP 线程。
  线程池根据需要(无任何调节)提供新的工作线程或 I/O 完成线程,直到达到每种线程类型的“最小值”设置。 默认情况下,最小线程数设置为系统上的处理器数。
  一旦现有(繁忙)线程的数量达到“最小”线程数,线程池(ThreadPool)将调节以每 500 毫秒向一个线程注入新线程的速率。这意味着,如果你的系统需要一个 IOCP 线程的工作突发(burst of work),它会很快处理这个工作。 但是,如果工作突发超过配置的“最小”设置,则在处理一些工作时会有一些延迟,因为线程池会等待发生两种情况:1、现有线程可以自由处理工作; 2、现有线程没有空闲 500ms,因此创建一个新线程。
  基本上,这意味着当繁忙线程的数量大于最小线程时,您可能在应用程序处理网络流量之前消耗 500ms 延迟。 此外,重点注意,当现有线程保持空闲超过 15 秒(基于我记住的),它将被清理,这个增长和收缩的周期可以重复。
  如果我们查看 StackExchange.Redis(build 1.0.450 或更高版本)中的错误消息,您将看到它呈现当前线程池的统计信息(请参阅下面的 IOCP 和 WORKER 详细信息)。
  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 或 WORKER 线程的增长被节制,StackExchange.Redis 会命中超时。
  建议:鉴于上述信息,建议将 IOCP 和 WORKER 线程的最小配置值设置为大于默认值的值。 我们不能一刀切地指导此值应是多少,因为一个应用程序的适当值,对另一个应用程序将会太高或太低。 该设置也会影响复杂应用程序的其他部分性能,因此您需要根据您的特定需求调整此设置。 一个较好的初始值是 200 或 300,然后根据需要进行测试和调整。
  如何配置此设置:
  · 在 ASP.NET 中,使用 “minIoThreads” 配置,设置 machine.config 文件中的 配置元素。 如果您在 Azure WebSites 内部运行,则此设置不会通过配置选项显示。 您可以通过 global.asax.cs 中的 Application_Start 方法以编程方式设置(参见下文)。
  重要说明:此配置元素中指定的值是按每个核心设置。 例如,如果你有一个 4 核心的机器,并希望你的 minIthreads 运行时设置为 200,你将使用 进行设置。
· 在ASP.NET之外,使用 ThreadPool.SetMinThreads(……) API。

文章来源:彭智勇


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [redis timeouts 常见问题] 推荐:

  导致Redis超时(Timeouts)常见问题

- - 移动开发 - ITeye博客
因实际应用中出现经常 Redis 超时问题,StackExchange.Redis 在 Github 上 Timeouts 一文从多个方面进行分析,并提供相应的解决方案, 为方便日后再次出现该问题时快速查阅,特写下本文作为技术笔记,同时给英文不太好的程序员(媛)提供参考,帮助大家更好的学习redis http://www.maiziedu.com/course/337/.

linux xampp常见问题

- We_Get - 博客园-首页原创精华区
1.安装xampp4linux后,只能本机(http://localhost)访问,局域网内其他机器无法访问. 解答:在/opt/lampp/etc中修改httpd.conf,将Listen 80修改为Listen 本机ip地址:80 本机ip地址使用ifconfig 查看. 2.我按照1修改之后,局域网内的机器还是无法访问.

storm常见问题解答

- - BlogJava-庄周梦蝶
    最近有朋友给我邮件问一些storm的问题,集中解答在这里. 一、我有一个数据文件,或者我有一个系统里面有数据,怎么导入storm做计算. 你需要实现一个Spout,Spout负责将数据emit到storm系统里,交给bolts计算. 怎么实现spout可以参考官方的kestrel spout实现:.

MariaDB常见问题FAQ

- - OurMySQL
MariaDB常见问题,同样适用于MySQL. 老版本MariaDB服务的相关旧信息. via似乎是个关键字,但是至少在MySQL5.1文档中找不到. 在MySQL5.1中执行成功,但是会出现1064错误 (毫无疑问,用avia替代via就可以). 答           elenst. 这个bug(https://bugs.launchpad.net/maria/+bug/1010351)被修复.

hadoop配置常见问题

- - 企业架构 - ITeye博客
收集记录一些Hadoop配置部署过程中遇到的问题. 这种方法解决了运行中的hadoop的safe mode问题,但是下次重启hadoop,还会出现这个问题. 其实这个问题,我猜测可能是由于目录/app/hadoop/tmp/mapred/system被破坏造成. 永久解决,可以删除掉/app/hadoop/tmp/,重新创建,重新format,重启hadoop——如果条件允许的话.

Zookeeper常见问题整理

- - CSDN博客推荐文章
当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态. Zk的选举算法使用ZAB协议:. 选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;.

关于链接的常见问题

- - Google China Blog
发表者:谷歌中文搜索质量团队. 转载自: 谷歌中文网站管理员博客. 发布时间:2012年9月29日 下午 03:08:00. 在我们的 网站管理员帮助论坛里,站长们问的最多的就是关于链接的问题. 很多站长询问一旦网站因为链接的原因被处理,应该怎样申请重新审核. 也有很多站长询问关于买卖链接方面的问题.

Java String 的十大常见问题

- - ITeye博客
Java字符串经常被问到的排名前十的问题.    1、如何比较字符串. 使用 “==”  还是 “equals()”.   简单来讲,“==”比较的是引用(对象的内存地址),“equals()” 比较值是否相等. 除非你想检测两个字符串是否是同一对象,否则都用equals().   当然了解字符串池的概念更好.

php初学者常见问题

- - SQL - 编程语言 - ITeye博客
最令PHP初学者头痛的十四个问题. 管理提醒: 本帖被 haowubai 执行置顶操作(2009-04-16) 【1】面之间无法传递变量 get,post,session在最新的php 版本中自动全局变量是关闭的,所以要从上一面取得提交过来得变量要使用$_GET[’foo’],$_POST[’foo’],$_SESSION[’foo’]来得到.

findbugs 常见问题 及解决方案

- - ITeye博客
1 Bad practice 坏的实践. 一些不好的实践,下面列举几个: HE:类定义了equals(),却没有hashCode();或类定义了equals(),却使用Object.hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode().