如何配置Apache CXF / Jetty线程池大小

时间:2015-01-16 20:37:45

标签: java web-services jetty cxf

我尝试将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

我错过了什么?

2 个答案:

答案 0 :(得分:0)

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

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

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

等系统行为信息一起
  • 预期的同时连接数
  • 平均连接时间
  • 平均请求持续时间

4处的线程数最大值 WAY 太低,您基本上将在单核心CPU上运行,具有1个网络接口,1个选择器,并且一次只处理1个请求序列。 (不切实际的情况)。

即便是第一个Android设备(G1)的系统规格最小线程数为19,只是为了启动,更不用说处理任何请求了。

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

一个小型生产系统预计会有几十个同时用户提供大量小额请求,这个系统是100个。

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

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

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

答案 1 :(得分:0)

Jetty使用的线程是从系统计算的,其CPU编号是此计算中使用的参数之一。 因此,基于系统资源,jetty发现它需要7个线程。另一方面,在配置中我们发现线程参数&#34; max Threads&#34; .. 所以只需增加它:

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