草庐IT

java - Tomcat 连接器架构、线程池和异步 servlet

coder 2023-05-17 原文

我想了解 Tomcat 的 BIO 和 NIO 连接器线程模型。我正在引用连接器的官方 Tomcat 7 文档,可以找到 here .基于它,这是我所怀疑的:

  • acceptorThread(s) :这是一个或最多 2 个线程(如文档中所述),仅负责接受传入的连接。这可以使用acceptorThreadCount进行配置,建议多cpu机器可以使用两个以上——
    • 这是为什么呢?
    • 这是否意味着同时打开的连接数与 cpu 数与服务器系统上允许的打开文件描述符数成比例?
  • 最大连接数:
    • 此设置与acceptCount 和系统上打开的文件描述符的数量有什么关系。
    • 为什么 NIO 连接器 (10000) 的默认值比 BIO (= maxThreads) 高得多?
  • acceptCount :这是所有请求处理线程都忙时的请求队列。
    • 当请求被放入这个队列时,是否也分配了一个文件描述符?还是只有在主动处理请求时才使用文件描述符?
  • 请求处理线程:该池中的线程数由 maxThreadsminSpareThreads 属性配置。
    • 这个线程池和 acceptorThreads 有什么关系?接受者线程是否在这个池中产生线程?
    • 据我了解,NIO 模型在请求处理线程方面比 BIO 模型更高效。它是如何实现这种效率的?
    • 正如我在各种资料中看到的那样,NIO 模型中的线程遵循 每个请求线程 范式与 BIO 模型的 每个连接线程 范式。此外,在 NIO 连接器模型中,实际的请求处理被委托(delegate)给不同的应用程序监控线程,而服务器的请求处理线程则免费返回到线程池以接受更多连接。 那么,这是否意味着 NIO 模型的好处只有在与服务器的连接具有 HTTP Keep-Alive 特性或应用程序使用 Servlet 时才会显现出来3.0的异步处理特性?
  • Servlet 3.0:
    • 使用 Servlet 3.0 时,应用程序 servlet 线程池的大小(相对于连接器线程池的大小)应该是多少才能达到最佳效率?
    • 当同时使用 BIO 模型和 this 时,处理请求的方式会有什么不同(假设连接器线程仍将使用 thread per connection 模型)?

请注意:所有关于 tomcat 7 的讨论。

最佳答案

  • acceptorThread(s) : This is a single or at the most 2 threads (as mentioned in the doc) which is responsible only for accepting in-coming connections. This can be configured using acceptorThreadCount, and it's suggested that more than two can be used for a multi-cpu machine -

    why is this ?

接受连接是一项成本非常低的操作,因此将多个线程专用于该任务是没有意义的。

Does this imply that the number of simultaneous open connections 
scales with the number of cpus versus the number of open file descriptors 
allowed on the server system ?

不,不是因为它在 CPU 方面的成本非常低。至于文件描述符,每个接受的连接都将使用一个文件描述符,因此服务器可以接受的最大连接数受可用文件描述符的数量限制。

  • maxConnections(s) :

    What is the relation between this setting and acceptCount and the number of open file descriptors on the system.

maxConnections 不能大于系统上打开的文件描述符的数量。请记住,其他进程也使用文件描述符,因此对于可用的文件描述符,可能希望对 maxConnections 保持保守,比如说 maxConnections <>

Why is the default value for this so much higher for the NIO connector 
( 10000 ) than for the BIO ( = maxThreads ) ?

这是因为在 NIO 中单个处理所有 IO,而在 BIO 中,服务器需要为每个连接创建/使用单独的线程。

  • acceptCount : This is the queue for requests when all request processing threads are busy.

    When requests are put into this queue, is a file descriptor assigned to it as well ?

是的,这是正确的,连接请求已被接受,但服务器尚未准备好为请求提供服务,因此连接被放入队列中。这样做是为了防止 TCP/堆栈超时连接请求,从客户端的角度来看,连接请求可能看起来像服务器停机。换句话说,服务器说“我在这里,一旦我有资源可以处理您的请求”。

Or is it only when a request is being actively processed, does it consume a file descriptor ?

没有。

希望这会有所帮助。

问候,

斯拉瓦·伊梅舍夫

关于java - Tomcat 连接器架构、线程池和异步 servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25356703/

有关java - Tomcat 连接器架构、线程池和异步 servlet的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  9. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  10. Tomcat AJP 文件包含漏洞(CVE-2020-1938) - 2

    目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控

随机推荐