Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 杰蒂,我的五根线在哪里?_Java_Multithreading_Jetty - Fatal编程技术网

Java 杰蒂,我的五根线在哪里?

Java 杰蒂,我的五根线在哪里?,java,multithreading,jetty,Java,Multithreading,Jetty,我正在使用spring+jetty。我正在配置jetty: @Bean public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() { final JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory(port); factory.addServerCus

我正在使用spring+jetty。我正在配置jetty:

@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
    final JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory(port);
    factory.addServerCustomizers((Server server) -> {
        final QueuedThreadPool threadPool = server.getBean(QueuedThreadPool.class);
        threadPool.setMinThreads(minThreads);
        threadPool.setMaxThreads(maxThreads);
        threadPool.setIdleTimeout(1000);
    });
    return factory;
}
这是可行的,但很奇怪

  • 设置minThreads=1,maxThreads=5,它不处理连接
  • 设置minThreads=1,maxThreads=6,它只处理一个连接
  • 设置minThreads=1,maxThreads=7,它只处理两个连接。 当我说处理时,我的意思是,它接受连接,但什么也不做。不回复,不中止。(我想他们在排队)

  • 那么,我的5个线程在哪里?

    您没有说明每个连接器如何将选择器和接收器分配到同一个线程池中

    您也没有将系统/硬件影响考虑到线程池中(您有多少cpu内核?是的,这很重要)

    您还定义了一个极小的线程池。您是否计划一行只提供一个http连接?在1个连接器上,使用HTTP/1.0,保持活动状态,无压缩,具有永不失败或超时的完美网络条件

    您是否100%确定您的用户代理(客户端)将遵守这些规则

    提示:您现在正在stackoverflow上查看的网页,使用现代web浏览器,将使用线程池中的9到18个活动线程,将线程池最大值增加到大约35个,并将在399ms内全部完成

    考虑以下任何一个将来的决定都会增加线程池的压力

    • 使用jetty代理:AsyncProxyServlet、AsyncMiddlemanServlet
    • 在服务器端使用WebSocket
    • 使用WebSocket客户端
    • 使用Http客户端
    • 启用HTTP/2
    您的设置应该引发一个IllegalStateException,指示您的配置非常低

    java.lang.IllegalStateException:线程不足:最多8个

    既然你说你正在使用Spring,请考虑在

    上关于这个问题的公开问题。

    这里有一些关于调整线程数以获得最大线程数的一般性建议(大手挥舞

    • 活动的、正在运行的连接数是您的基线,从它开始作为您的最大线程数,然后从那里向上移动
    • 与HTTP/2相比,HTTP/1.x使用的线程更少
    • 较小的web资源大小倾向于较低的最大线程数
    • 大型或长期web资源倾向于更大的最大线程数
    • 使用Servlet 3.1+异步I/O意味着减少最大线程数(仅在实际需要读和/或写时使用线程)
    • 使用Servlet3.0(或更早版本)阻塞I/O意味着更多的最大线程(必须为每个连接读/写指定线程)
    • 使用HTTP/1.x,平均web站点的最大线程数为200到500,具有平均负载、平均web资源大小和平均web资源定时
    • 对于一个繁重的网站,使用许多功能(代理、websockets、httpclient、http/2),最大线程配置通常为3000到5000
    • 对于极端web站点,尽可能多地使用CPU内核,专门使用Servlet 3.1异步I/O,将线程数量最大为9000个,最大为20000个(取决于您的负载配置文件)
    据我们所知,使用Jetty的最小web站点使用19MB内存,并且在其线程池中配置了最多8个线程。(它是挪威偏远地区的一个气象站)

    据我们所知,使用Jetty的最大单机网站在30核机器上使用189GB内存,最多配置30000个线程,8个网络接口,每个接口上启用HTTP/1.x和HTTP/2,执行SSL+Gzip+WebSocket,平均每时每刻都有280000个活动连接(在一天中的某些时间,每天的峰值仅为800000个活动连接)