现象

今天在做一个项目时, 将 tomcat 的 maxThreads 加大, 加到了 1024, tomcat 提供的服务主要是做一些运算, 然后插入 redis, 查询 redis, 最后将任务返回给客户端

在做压测时, 同时开了 1000 个线程, 并发发起 http 请求去访问 tomcat 的服务, 结果在第一次访问 tomcat 时出现了一系列的 redis 查询超时, 例如 1000 个并发发起 10W 次请求, 可能头 1W 次请求会有 2000 次左右的 redis 超时造成服务失败, 但是之后就再不会出现 redis 超时的情况.

解决

通过观察 vmstat, 发现在出现超时时, r (运行队列) 特别高, 达到 12~25, 持续时间为 2~3 秒, 这段时间出现了很多 redis 超时. 而以后不出现超时时, r 值都保持在 5 左右. 此时, 通过缩减 tomcat 线程数, 减到 200, 再重新测试, 则没有出现超时.

分析

这是因为我的 redis 客户端是异步客户端, 但是我在使用它的时候是用异步客户端模拟同步客户端执行(调用 future.get()), 客户端内部使用 netty 实现, netty 的工作线程只有 4 或 8 个. 当我们刚启动 tomcat 服务时, 没有预热, 系统性能较差, 此时排队任务多的话, 会让巨大的 tomcat 业务线程(1024个)占据 cpu 的任务队列, 而 netty 工作线程较少, 得不到 cpu 时间执行, 最后造成超时.

这里最大的问题在于在同步的 tomcat 业务代码中使用了异步的 redis 客户端, 因为 tomcat 业务线程数量大, 占据了大量 cpu 时间, 让 redis 客户端线程得不到执行, 最后导致了问题出现.

如果说这里将 tomcat 的业务处理改为异步处理 (使用 servlet 3.0), 那么则可以大量缩减 tomcat 的业务线程, 这样既可以减少业务线程切换, 又可以让 redis 客户端线程得到更多的执行时间.

延伸

抛开使用异步的 redis 客户端不说, 如果使用的是一个传统的同步 db 客户端, 那么 db 客户端的执行线程就是业务线程, 线程的 cpu 时间是均等的, 则不会出现这个超时的问题. 那么应该如何界定何时应该启用多少线程?

当我们的业务线程内有 io 操作, 例如 mysql 的操作时, 如果这个操作很耗时, 例如需要执行 2s, 我们则应该分配更多地线程. 假设此时并发 1000 请求, 而只有 8 个业务线程, 那么这 8 个业务线程只能执行 8 个任务, 而且因为实在等待 mysql 的 io 返回, cpu 此时处于闲置状态, 另外的 992 个请求因为没有线程执行, 只能排队等待. 所以此时如果分配更多的业务线程, 则可以更有效地利用 cpu 资源.

而如果业务处理是 cpu 密集型的, 则应该使用更少的线程. 因为此时 cpu 会处于繁忙状态, 增加更多地线程也不会让线程得到执行时间片, 反而会增加线程切换的开销.

总结

对于我的业务场景, 最好的方式应该是减少业务线程, 并将业务处理使用 servlet 3.0 改为全异步的方式. 原因是因为使用的是异步的 redis 客户端, 它不会让线程处于闲置的等待状态, 这样既能减少线程切换, 又能合理的分配 tomcat 业务线程与 redis 客户端线程的执行时间片.

一个使用高并发高线程数 Server 使用异步数据库客户端造成的超时问题的更多相关文章

  1. 转载:IIS 之 连接数、并发连接数、最大并发工作线程数、队列长度、最大工作进程数

    一.IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数”. 客户请求的连接内容包括: [ ...

  2. IIS 之 连接数、并发连接数、最大并发工作线程数、队列长度、最大工作进程数

    一.IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数”. 客户请求的连接内容包括: [ ...

  3. 高并发&高可用系统的常见应对策略 秒杀等-(阿里)

    对于一个需要处理高并发的系统而言,可以从多个层面去解决这个问题. 1.数据库系统:数据库系统可以采取集群策略以保证某台数据库服务器的宕机不会影响整个系统,并且通过负载均衡策略来降低每一台数据库服务器的 ...

  4. PHP高并发高负载系统架构

    PHP高并发高负载系统架构 1.为什么要进行高并发和高负载的研究 1.1.产品发展的需要 1.2.公司发展的需要 1.3.当前形式决定的 2.高并发和高负载的约束条件 2.1.硬件 2.2.部署 2. ...

  5. java处理高并发高负载类网站的优化方法

    java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF ...

  6. IIS:连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解

    Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是Windows NT版本的可选 ...

  7. [转]java处理高并发高负载类网站的优化方法

    本文转自:http://www.cnblogs.com/pengyongjun/p/3406210.html java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,ja ...

  8. IIS最大并发连接数 = 队列长度 + IIS最大并发工作线程数

    深入理解IIS的多线程工作机制   首先让我们来看看IIS里面的这2个数字:最大并发连接数,队列长度.先说这2个数字在哪里看. 最大并发连接数:在IIS中选中一个网站,右键网站名称,在右键菜单中找到并 ...

  9. IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的

    IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫" ...

随机推荐

  1. 【AT91SAM3S】建立基于SAM3S库的工程并点亮LED

    习惯了ST的库,猛然间看到ATMEL的库,有点无从下手.这几天参考这示例工程,终于建立了一个使用ATMEl库的工程. 软件库版本: 软件平台:MDK470A 硬件平台:英蓓特 EB-SAM3S MCU ...

  2. server application error应用错误

    本地使用IIS测试ASP脚本网页,结果发现提示[Server Application Error The server has encountered an error while loading a ...

  3. PHP发送请求头和接收打印请求头

    一.发送请求头 //发送地址 $url = 'http://127.0.0.1/2.php'; //请求头内容 $headers = array( 'Authorization: '.$basic, ...

  4. Notice: Trying to get property of non-object problem(PHP)解决办法 中间件只能跳转不能返任何数据

    这里实际是调用了一个zend的数据库访问的方法,使用了fetchAll方法,但由于数据库中没有该记录,所以返回的对象是null,所以我就判断对象是否为null: 复制代码代码如下: if($obj== ...

  5. 解决Tomcat catalina.out 不断成长导致档案过大的问题

    Tomcat的网站上的说法http://wiki.apache.org/tomcat/FAQ/Logging#Q6: System.out 和 System.err 都被打印到 catalina.ou ...

  6. itextSharp 附pdf文件解析

    一.PdfObject: pdf对象 ,有9种,对象是按照对象内涵来分的,如果按照对象的使用规则来说,对象又分为间接对象和直接对象.间接对象是PDF中最常用的对象,如前面对象集合里面的,所有对象都是间 ...

  7. 一些代码 II (ConfigParser、创建大文件的技巧、__getattr__和__getattribute__、docstring和装饰器、抽象方法)

    1. ConfigParser format.conf [DEFAULT] conn_str = %(dbn)s://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s ...

  8. 转:Tomcat启动过程中找不到JAVA_HOME JRE_HOME的解决方法

    转自:http://blog.sina.com.cn/s/blog_61c006ea0100l1u6.html 原文: 在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomca ...

  9. UINavigationItem UINavigationBar 关系分析[转]

    http://blog.csdn.net/luoyeffcs/article/details/16106707 目录 1.关系分析 2.关系综述 3.概念点 4.疑问 1.关系分析 UIBarItem ...

  10. js实现多个图片淡入淡出,框架

    单个淡入淡出已经写过,可以看看上几遍的博文 <style> *{ margin:0; padding:0; } div{ height:100px; width:100px; backgr ...