如何通过单一生产案例全面掌握Tomcat线程池的工作原理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计588个文字,预计阅读时间需要3分钟。
最近生产上遇到一个case,终于想明白了原因,今天周末来整理一下:
+ 生产case+ 最近测试istio mesh的预热功能(调用端最小连接数原则)+ 控制调用端进入k8s刚扩展来的容器的流量+ 因为刚启动
最近生产上遇到一个case,终于想明白了原因,今天周末来整理一下
生产case最近测试istio mesh的预热功能(调用端最小连接数原则)
来控制调用端进入k8s刚扩出来的容器的流量
因为刚启动的JVM解释执会导致慢请求,如果不控制流量会导致cpu突然飙升等带来的一系列连锁反应!
表像这里我借用github上有个哥们的相类似提问:
翻译一下:
首先突发流量导致线程突然上升到最大线程(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默认都是不推荐使用共享的Executor(被注释的), 但是在Connector里面又不支持设置工作线程的maxIdleTime, 这个有点不理解为什么这么设计!
总结通过这个case,带着这些参数在tomcat里是怎么起作用的疑问,结合tomcat的源码,是次很有收获的梳理!
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后须在文章页面明显位置给出作者和原文连接,谢谢。
本文共计588个文字,预计阅读时间需要3分钟。
最近生产上遇到一个case,终于想明白了原因,今天周末来整理一下:
+ 生产case+ 最近测试istio mesh的预热功能(调用端最小连接数原则)+ 控制调用端进入k8s刚扩展来的容器的流量+ 因为刚启动
最近生产上遇到一个case,终于想明白了原因,今天周末来整理一下
生产case最近测试istio mesh的预热功能(调用端最小连接数原则)
来控制调用端进入k8s刚扩出来的容器的流量
因为刚启动的JVM解释执会导致慢请求,如果不控制流量会导致cpu突然飙升等带来的一系列连锁反应!
表像这里我借用github上有个哥们的相类似提问:
翻译一下:
首先突发流量导致线程突然上升到最大线程(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默认都是不推荐使用共享的Executor(被注释的), 但是在Connector里面又不支持设置工作线程的maxIdleTime, 这个有点不理解为什么这么设计!
总结通过这个case,带着这些参数在tomcat里是怎么起作用的疑问,结合tomcat的源码,是次很有收获的梳理!
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后须在文章页面明显位置给出作者和原文连接,谢谢。

