如何计算tomcat线程池大小?

  • 背景

  在我们的日常开发中都涉及到使用tomcat做为服务器,但是我们该设置多大的线程池呢?以及根据什么原则来设计这个线程池呢?

  接下来,我将介绍本人是怎么设计以及计算的。

  • 目标

  确定tomcat服务器线程池大小

  • 具体方法

  众所周知,tomcat接受一个request后处理过程中,会涉及到cpu和IO时间。其中IO等待时,cpu被动放弃执行,其他线程就可以利用这段时间片进行操作。

所以我们可以采用服务器IO优化的通用规则:

线程大小 = ( (线程io时间 + 线程cpu)  / 线程cpu time) * cpu核数

举例: 线程io时间为100ms(IO操作比如数据库查询,同步远程调用等),线程cpu时间10ms,服务器物理机核数为4个。通过上面的公式,我们计算出来的大小是 ((100 + 10 )/10 ) *4 = 44。理论上我们有依据,但是实际计算过程中我们怎么知道线程IO时间和cpu时间呢? 这个就涉及到实际编码过程中的怎么样监控处理时间啦。

下面我介绍本人项目中的做法

  1. 通过java 实现内置的filter接口,我们可以拿到一个request消耗的总时间

public class MoniterFilter implements Filter {private static final Logger logger = LoggerFactory.getLogger(MoniterFilter.class);@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {long start = System.currentTimeMillis();HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;String uri = httpRequest.getRequestURI();String params = getQueryString(httpRequest);try {chain.doFilter(httpRequest, httpResponse);} finally {long cost = System.currentTimeMillis() - start;logger.info("access url [{}{}], cost time [{}] ms )", uri, params, cost);}private String getQueryString(HttpServletRequest req) {StringBuilder buffer = new StringBuilder("?");Enumeration<String> emParams = req.getParameterNames();try {while (emParams.hasMoreElements()) {String sParam = emParams.nextElement();String sValues = req.getParameter(sParam);buffer.append(sParam).append("=").append(sValues).append("&");}return buffer.substring(0, buffer.length() - 1);} catch (Exception e) {logger.error("get post arguments error", buffer.toString());}return "";}@Overridepublic void destroy() {}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}}

  2. 通过添加切面来监控线程IO耗时(jdk,cglib)

public class DaoInterceptor implements MethodInterceptor {private static final Logger logger = LoggerFactory.getLogger(DaoInterceptor.class);@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {StopWatch watch = new StopWatch();watch.start();Object result = null;Throwable t = null;try {result = invocation.proceed();} catch (Throwable e) {t = e == null ? null : e.getCause();throw e;} finally {watch.stop();logger.info("({}ms)", watch.getTotalTimeMillis());}return result;}}

通过上述代码就可以计算出相应时间,从而计算出线程大小啦。但是我们就到此为止了吗?

其实还没有,计算出的数值只是存在理论情况下,我们还是需要通过压测工具(Jmeter)来压测一下线服务器,同时根据qps值来动态微调刚才计算出的线程池大小。

如果文章还对大家有实际意义,请推荐一下。

http://www.cnblogs.com/tylercao/p/4733238.html

转载于:https://www.cnblogs.com/shangdongbin/p/7699641.html

如何计算tomcat线程池大小?相关推荐

  1. java 线程池 初始大小_为什么tomcat的默认线程池大小如此之大? - java

    我注意到默认的tomcat 7线程池大小似乎是200. 但是普通的CPU似乎有16个内核. 因此只能并行执行16个线程 为什么tomcat使用那么多线程. 参考方案 多年以来,许多单核计算机问世,并且 ...

  2. 别再纠结线程池大小/线程数量了,没有固定公式的

    可能很多人都看到过一个线程数设置的理论: CPU 密集型的程序 - 核心数 + 1 I/O 密集型的程序 - 核心数 * 2 不会吧,不会吧,真的有人按照这个理论规划线程数? 线程数和CPU利用率的小 ...

  3. 别再纠结线程池大小 + 线程数量了,没有固定公式的!

    来源:juejin.cn/post/6948034657321484318 线程数和CPU利用率的小测试 线程数和CPU利用率的小总结 线程数规划的公式 真实程序中的线程数 附录 Java 获取CPU ...

  4. idhttpserver是按线程接受请求的吗_1000个并发线程,10台机器,每台机器4核,设计线程池大小...

    一道面试题 兄弟们,怎么说? 我觉得如果你工作了两年左右的时间,或者是突击准备了面试,这题回答个八成上来,应该是手到擒来的事情.这题中规中矩,考点清晰,可以说的东西不是很多. 但是这都上血书了,那不得 ...

  5. 1000个并发线程,10台机器,每台机器4核,设计线程池大小

    这是why哥的第 71 篇原创文章 一道面试题 兄弟们,怎么说? 我觉得如果你工作了两年左右的时间,或者是突击准备了面试,这题回答个八成上来,应该是手到擒来的事情.这题中规中矩,考点清晰,可以说的东西 ...

  6. 如何合理地估算线程池大小?

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 来源:蒋小强 , ifeve.com/how-to-calculate-threadpool-si ...

  7. python3 ThreadPoolExecutor 线程池大小设置

    线程池的理想大小取决于被提交任务的类型以及所部署系统的特性.线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内存使用量,而且还可能 ...

  8. 线程池大小如何确定?

    在java中,几乎所有需要异步或者并发执行任务的程序都可以使用线程池.在开发过程中,合理的使用线程池能够带来3个好处: 首先是降低资源消耗.通过重复利用已创建的线程降低创建线程和销毁线程所带来的开销. ...

  9. 如何用利特尔法则调整线程池大小

    利特尔法则 利特尔法则派生于排队论,用以下数学公式表示: L=λWL = λW L=λW L 系统中存在的平均请求数量. λ 请求有效到达速率.例如:5/s 表示每秒有5个请求到达系统. W 请求在系 ...

最新文章

  1. MongoDB安装和MongoChef可视化管理工具的使用
  2. 数据结构源码笔记(C语言):哈希表的相关运算算法
  3. Kubernetes 弹性伸缩全场景解析 (四)- 让核心组件充满弹性
  4. 干货|吴恩达Coursera课程教你学习神经网络二!
  5. 73 forward动作
  6. 【云栖大会】用爱成就彼此 距云栖大会还有10天
  7. 圣诞节海报这么做?不妨借鉴下这些模板!
  8. MySQL 创建数据库并且指定编码
  9. E-BOM和M-BOM的区别
  10. 勤快的程序猿都没啥前途的,赶紧改掉你的坏毛病吧!
  11. pull request 时遇到 conflicted 的解决方法
  12. Python程序设计 作业1
  13. 一路走来,关于光城那些事
  14. PCIe 5.0 spec学习1.1---均衡
  15. octave安装包pkg install命令及可选参数
  16. 超级攻略!Pandas\NumPy\Matrix用于金融数据准备
  17. 大数据技术原理与应用(林子雨老师)慕课课后习题
  18. 从带宏密码保护的Excel文件中导出VBA代码和Sheet
  19. volatile vs synchronized
  20. gif 里有php代码,GIF转MP4的PHP代码

热门文章

  1. php等待参数跳转,Thinkphp页面跳转设置跳转等待时间的操作
  2. mysql 模糊查询 s_MySql反向模糊查询
  3. linux与unix的区别_Linux与Unix
  4. Android ViewPager示例教程
  5. easymock使用方法_EasyMock无效方法– ExpectLastCall()
  6. SQL创建数据库– PostgreSQL,MySQL,SQL Server
  7. Akka构建Reactive应用《one》
  8. 全栈工程师的3个关键技能是什么?
  9. 基于OpenCV的计算机视觉入门(4)线段和形状的绘制
  10. 改变图片局部透明度,实现透明度根据位置不而渐变