现象

今天在做一个项目时, 将 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. Sedgewick的红黑树

    红黑树一直是数据结构中的难点,大部分关于算法与数据结构的学习资料(包括<算法导论>)对于这部分的讲解都是上来就下定义,告诉我们红黑树这个性质那个性质,插入删除要注意1234点,但是基本没有 ...

  2. springfox.documentation.service.ApiInfo配置示例

    Java Code Examples for springfox.documentation.service.ApiInfo The following are top voted examples ...

  3. 【知识点】业务连接服务(BCS)认证概念整理

    业务连接服务(BCS)认证概念整理 I. BDC认证模型 BDC服务支持两种认证模型:信任的子系统,模拟和代理. 在信任的子系统模型中,中间层(通常是Web服务器)通过一个固定的身份来向后端服务器取得 ...

  4. Apache性能优化、超时设置,linux 重启apache

    在httpd.conf中去掉Include conf/extra/httpd-default.conf前的#以使httpd-default.php生效.其中调节以下参数Timeout 15 (连接超时 ...

  5. Windows下利用Windbg 分析dump

    概述: 注册生成dump文件的函数. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题. 如下代码生成dump ...

  6. nodejs & nodemailer

    nodejs & nodemailer https://www.npmjs.com/package/nodemailer 上面的連接裏面 有有一個例子: 可以直接拿來用: 安裝依賴,在pack ...

  7. spring 获取 bean

    不通过注解或者是配置文件怎么获取spring中定义的bean呢?有几个方法: 1.实现ApplicationContextAware <bean class="com.xxx.Spri ...

  8. C# .net ACCESS 网页增删改查 --留言板

    话不多说,上代码 http://yunpan.cn/QaQs5Dzz8ZIxK  访问密码 041b

  9. 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解

    CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...

  10. ubuntu mysql emma中文乱码问题解决

    ubuntu mysql emma中文乱码问题解决 emma默认用apt-get 安装的话,emma是不支持中文的,配置文件或直接修改emma程序源文件(python). apt-get安装emma ...