Tomcat maxThreads 是接受线程或请求处理线程的配置

Posted

技术标签:

【中文标题】Tomcat maxThreads 是接受线程或请求处理线程的配置【英文标题】:Tomcat maxThreads is config for acceptor threads or Request processing threads 【发布时间】:2021-07-04 09:24:06 【问题描述】:

    我关注oracle doc 并想知道tomcat maxThreads 配置是做什么用的?接受者线程还是请求处理线程?

    作为 oracle 文档

请求处理线程池中的线程,然后从队列中获取连接并为请求提供服务。

要做什么:它是 pop() 队列中的连接并处理此连接,还是请求处理线程仅侦听来自连接队列中的连接的请求?

谢谢

【问题讨论】:

这能回答你的问题吗? Tomcat - maxThreads vs maxConnections 我想您知道 Oracle iPlanet Web Server 和 Tomcat 是两个不同的产品。 Tomcat Coyote 始终有一个接受者线程和一个请求处理线程池,但是这两者之间的交互细节取决于端点类型(BIO(在 8.5 中删除)、NIO、NIO2 或 APR)。您能否说明您对哪种端点类型感兴趣? @PiotrP.Karwasz 这是我的错误,我的意思是 tomcat coyote nio,你能解释一下当对 tomcat 服务器的请求运行 spring boot 应用程序时会发生什么,谢谢 【参考方案1】:

正如问题Tomcat - maxThreads vs maxConnections 中所解释的,maxThreads 属性是用于处理请求的Executor 的大小。最多同时处理maxThreads 个请求。

在 Tomcat 8.5 及更高版本上,所有连接器类型还使用接受器线程,它最多只能接受 maxConnections 连接。那些超出限制的连接仍保留在操作系统的队列中(acceptCount 属性是操作系统对此类队列首选大小的提示)。

但是,Tomcat Coyote 的其余架构明显不同于 Oracle iPlanet Web Server,并且取决于所使用的连接器类型。

您可以在this article阅读NIO连接器的详细信息。基本上:

服务器通过使用Selectors 轮询套接字来响应网络事件。这样一个线程就可以为所有客户端连接提供服务。

只有 3 个线程处理网络 I/O:

    Acceptor,它只接受新连接并将它们发送给轮询器, Poller,它响应读/写事件并将它们分派给请求执行器, BlockPoller,在版本9.0.47 中消失并处理ServletInputStreamServletOutputStream 上的阻塞操作。 Poller 接受了它的任务。

没有连接队列。上面提到的线程只是将Runnable 任务提交给执行器。执行器内部有一个Runnables 队列,每个线程在空闲时从那里挑选一个任务。

【讨论】:

以上是关于Tomcat maxThreads 是接受线程或请求处理线程的配置的主要内容,如果未能解决你的问题,请参考以下文章

jmeter对tomcat性能测试

Tomcat调优及acceptCountmaxConnections与maxThreads参数的含义和关系

Tomcat调优及acceptCountmaxConnections与maxThreads参数的含义和关系

Tomcat - maxThreads 与 maxConnections

tomcat的线程配置

tomcat优化