Java 杰蒂,我的五根线在哪里?
我正在使用spring+jetty。我正在配置jetty:Java 杰蒂,我的五根线在哪里?,java,multithreading,jetty,Java,Multithreading,Jetty,我正在使用spring+jetty。我正在配置jetty: @Bean public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() { final JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory(port); factory.addServerCus
@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;
}
这是可行的,但很奇怪
那么,我的5个线程在哪里?您没有说明每个连接器如何将选择器和接收器分配到同一个线程池中 您也没有将系统/硬件影响考虑到线程池中(您有多少cpu内核?是的,这很重要) 您还定义了一个极小的线程池。您是否计划一行只提供一个http连接?在1个连接器上,使用HTTP/1.0,保持活动状态,无压缩,具有永不失败或超时的完美网络条件 您是否100%确定您的用户代理(客户端)将遵守这些规则 提示:您现在正在stackoverflow上查看的网页,使用现代web浏览器,将使用线程池中的9到18个活动线程,将线程池最大值增加到大约35个,并将在399ms内全部完成 考虑以下任何一个将来的决定都会增加线程池的压力
- 使用jetty代理:AsyncProxyServlet、AsyncMiddlemanServlet
- 在服务器端使用WebSocket
- 使用WebSocket客户端
- 使用Http客户端
- 启用HTTP/2
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个(取决于您的负载配置文件)