【问题标题】:How to configure Apache CXF/Jetty Thread Pool Size如何配置 Apache CXF/Jetty 线程池大小
【发布时间】:2015-01-16 20:37:45
【问题描述】:

我尝试将 Apache CXF 配置为使用有限数量的线程,但 CXF 似乎是某种基于 CPU 数量的自动调整大小。 (我认为这是因为在一台机器上工作的相同配置文件在另一台具有更多 CPU 的机器上失败)。

xml 看起来像这样:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
    xsi:schemaLocation="http://cxf.apache.org/transports/http/configuration
            http://cxf.apache.org/schemas/configuration/http-conf.xsd
            http://cxf.apache.org/transports/http-jetty/configuration
            http://cxf.apache.org/schemas/configuration/http-jetty.xsd
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <httpj:engine-factory bus="cxf">
        <httpj:engine port="0">
            <httpj:threadingParameters minThreads="2" maxThreads="4" />
        </httpj:engine>
    </httpj:engine-factory>
</beans>

但是,当我在另一台具有更多 CPU 的机器上运行它时,我收到此错误:

Caused by: org.apache.cxf.interceptor.Fault: Could not start Jetty server on port 10,100: Not enough threads configured for port 10,100.  Need at least 7 (6 for Jetty selectors and set managers) but only 4 configured.
        at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.addServant(JettyHTTPServerEngine.java:386)
        at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.activate(JettyHTTPDestination.java:178)
        at org.apache.cxf.transport.AbstractObservable.setMessageObserver(AbstractObservable.java:48)
        at org.apache.cxf.binding.AbstractBaseBindingFactory.addListener(AbstractBaseBindingFactory.java:97)
        at org.apache.cxf.binding.soap.SoapBindingFactory.addListener(SoapBindingFactory.java:901)
        at org.apache.cxf.endpoint.ServerImpl.start(ServerImpl.java:131)
        at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:349)
        ... 7 more
Caused by: org.apache.cxf.interceptor.Fault: Not enough threads configured for port 10,100.  Need at least 7 (6 for Jetty selectors and set managers) but only 4 configured.
        at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.setupThreadPool(JettyHTTPServerEngine.java:469)
        at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.addServant(JettyHTTPServerEngine.java:374)
        ... 13 more

我错过了什么?

【问题讨论】:

    标签: java web-services jetty cxf


    【解决方案1】:

    对于 Web 服务器,低线程数最大值非常糟糕。

    实际线程数最小值是根据以下系统和配置信息计算得出的。

    • CPU 内核数
    • 网络接口数量
    • 定义的连接器数量
    • 需要的网络选择器数量

    连同系统行为信息,如

    • 预期的同时连接数
    • 平均连接持续时间
    • 请求的平均持续时间

    线程数最大值为 4 WAY 太低了,您基本上会在单核 cpu 上运行,具有 1 个网络接口、1 个选择器,并且一次只能处理 1 个请求序列。 (不切实际的场景)。

    即使是第一台 Android 设备(G1),系统规范的最小线程数也只有 19 个才能启动,更不用说处理任何请求了。

    一些统计数据,一个 Raspberry PI 处理 2 个 Web 浏览器,提供静态页面(从系统监控进程生成的 html 和图像)在线程数为 45 时运行效率最高。

    一个需要几十个同时处理大量小请求的用户的小型生产系统是 100 个。

    处理数千个快速 API 调用的大型生产系统大约有 400 个。

    处理数千个较大尺寸响应(图像等)的大型生产系统的线程数约为 600。

    重点是,永远不要从低处开始,你只是把火箭筒放在你的脚上(你已经远远超过了仅仅把你的脚打掉)。从默认开始,然后根据您的系统和您获得的流量进行监控和调整。

    【讨论】:

    • 这不是一个网络应用程序(在典型意义上)。它为正在运行的服务器进程提供了一个基本的 Web 服务接口,使用户可以控制正在运行的进程。每个服务器进程有 1 个用户。所以实际上 - 我们只需要 1 个线程!
    • 如果您正在运行 Jetty,那么您必须遵守 Jetty 的要求、规则和行为。每个服务器进程没有 1 个用户仍然符合您的最大利益,因为这条快乐的路径永远不会 100% 可靠(从您的客户的角度来看)。 1 个失败的请求,并且您为另一个好的请求锁定了所有可用线程(直到第一个请求超时)。选择一个合理的最小值。检查您可以部署到的系统并选择一个合理的最小值。
    • 问题是 Jetty 不会让我选择一个合理的最小值!我想将其配置为 4 个线程。但它告诉我我不能少于 7。但是在不同的机器上,相同的配置文件(有 4)不是问题。所以我真正想要的答案是被告知 如何 强制 Jetty 使用我告诉它的东西,而不是它告诉我的东西。 (到底谁在这里负责?)
    • 谁负责?好吧,不是码头,因为您使用的是 cxf 和 spring。那些将负责你的情况。您无权访问 Jetty 必须配置的低级配置。所以你被三个选项困住了。 1) 继续使用这种抽象,并与 spring + cxf 的发现本质一起生活。 2) 使用 cxf 和 spring 提交错误以公开更多配置 3) 不要使用 spring 和 cxf 来设置和配置您的服务器,直接使用 jetty。
    【解决方案2】:

    Jetty 使用的线程是从系统计算出来的,该系统的 CPU 数量是此计算中使用的参数之一。 因此,根据系统资源,jetty 发现它需要 7 个线程。另一方面,在配置中我们发现线程参数“max Threads”.. 所以只要增加它:

    <httpj:threadingParameters minThreads="1" maxThreads="7"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-01
      • 2013-04-11
      • 2013-09-03
      • 1970-01-01
      • 2018-11-23
      • 2020-01-22
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多