如何通过单一生产案例全面掌握Tomcat线程池的工作原理?

2026-05-25 06:511阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计588个文字,预计阅读时间需要3分钟。

如何通过单一生产案例全面掌握Tomcat线程池的工作原理?

最近生产上遇到一个case,终于想明白了原因,今天周末来整理一下:

+ 生产case+ 最近测试istio mesh的预热功能(调用端最小连接数原则)+ 控制调用端进入k8s刚扩展来的容器的流量+ 因为刚启动

最近生产上遇到一个case,终于想明白了原因,今天周末来整理一下

生产case

最近测试istio mesh的预热功能(调用端最小连接数原则)

来控制调用端进入k8s刚扩出来的容器的流量

因为刚启动的JVM解释执会导致慢请求,如果不控制流量会导致cpu突然飙升等带来的一系列连锁反应!

表像这里我借用github上有个哥们的相类似提问:

image

翻译一下:

首先突发流量导致线程突然上升到最大线程(800),

流量下来后还在工作的线程(busy threads)线程就下降到了 10,

但是tomcat的 currentThreadCount 仍然是 800。

根据对于线程池的理解,tomcat的工作线程空闲 60 秒(默认),它就会被回收呀,为啥一直下不来呢?

我和他只是配置有点不一样,表像是一样的,也是同样的疑问

问题重点
  • 为什么流量下来后tomcat的工作线程居高不下迟迟得不到回收?
  • 查文档或者搜google,都说设置maxIdleTime,其实它是有坑的

假设tomcat的配置如下(关键参数):

<!--Theconnectorscanuseasharedexecutor,youcandefineoneormorenamedthreadpools <Executorname="tomcatThreadPool"namePrefix="catalina-exec-" maxThreads="150"minSpareThreads="4"maxIdleTime="60000"/> --> <Connectorport="8080" protocol="org.apache.coyote.tomcat.apache.org/tomcat-7.0-doc/config/tomcat.apache.org/tomcat-8.0-doc/config/http.html

注意的一点是,一定要却别理解Excutor和Connector两种在创建线程池是有区别的,不能混淆了

如果用Connector创建的线程池是写死60s!

如何通过单一生产案例全面掌握Tomcat线程池的工作原理?

由于tomcat默认都是不推荐使用共享的Executor(被注释的), 但是在Connector里面又不支持设置工作线程的maxIdleTime, 这个有点不理解为什么这么设计!

总结

通过这个case,带着这些参数在tomcat里是怎么起作用的疑问,结合tomcat的源码,是次很有收获的梳理!


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后须在文章页面明显位置给出作者和原文连接,谢谢。

本文共计588个文字,预计阅读时间需要3分钟。

如何通过单一生产案例全面掌握Tomcat线程池的工作原理?

最近生产上遇到一个case,终于想明白了原因,今天周末来整理一下:

+ 生产case+ 最近测试istio mesh的预热功能(调用端最小连接数原则)+ 控制调用端进入k8s刚扩展来的容器的流量+ 因为刚启动

最近生产上遇到一个case,终于想明白了原因,今天周末来整理一下

生产case

最近测试istio mesh的预热功能(调用端最小连接数原则)

来控制调用端进入k8s刚扩出来的容器的流量

因为刚启动的JVM解释执会导致慢请求,如果不控制流量会导致cpu突然飙升等带来的一系列连锁反应!

表像这里我借用github上有个哥们的相类似提问:

image

翻译一下:

首先突发流量导致线程突然上升到最大线程(800),

流量下来后还在工作的线程(busy threads)线程就下降到了 10,

但是tomcat的 currentThreadCount 仍然是 800。

根据对于线程池的理解,tomcat的工作线程空闲 60 秒(默认),它就会被回收呀,为啥一直下不来呢?

我和他只是配置有点不一样,表像是一样的,也是同样的疑问

问题重点
  • 为什么流量下来后tomcat的工作线程居高不下迟迟得不到回收?
  • 查文档或者搜google,都说设置maxIdleTime,其实它是有坑的

假设tomcat的配置如下(关键参数):

<!--Theconnectorscanuseasharedexecutor,youcandefineoneormorenamedthreadpools <Executorname="tomcatThreadPool"namePrefix="catalina-exec-" maxThreads="150"minSpareThreads="4"maxIdleTime="60000"/> --> <Connectorport="8080" protocol="org.apache.coyote.tomcat.apache.org/tomcat-7.0-doc/config/tomcat.apache.org/tomcat-8.0-doc/config/http.html

注意的一点是,一定要却别理解Excutor和Connector两种在创建线程池是有区别的,不能混淆了

如果用Connector创建的线程池是写死60s!

如何通过单一生产案例全面掌握Tomcat线程池的工作原理?

由于tomcat默认都是不推荐使用共享的Executor(被注释的), 但是在Connector里面又不支持设置工作线程的maxIdleTime, 这个有点不理解为什么这么设计!

总结

通过这个case,带着这些参数在tomcat里是怎么起作用的疑问,结合tomcat的源码,是次很有收获的梳理!


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后须在文章页面明显位置给出作者和原文连接,谢谢。