And*_*rew 4 java multithreading 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;
}
Run Code Online (Sandbox Code Playgroud)
它有效,但很奇怪。
那么,我的 5 个线程在哪里?
您没有考虑每个连接器如何将选择器和接受器分配到同一个线程池中。
您也没有将系统/硬件影响考虑到线程池中(您有多少个 CPU 内核?是的,这很重要)。
您还定义了一个可笑的小线程池。您是否打算连续只提供 1 个 http 连接?在 1 个连接器上,使用 HTTP/1.0,保持活动状态,无压缩,完美的网络条件,永不失败或超时?
您是否 100% 确定您的用户代理(客户端)会遵守这些规则?
提示:您现在正在查看的网页,在 stackoverflow 上,使用现代网络浏览器,会使用线程池中的 9 到 18 个活动线程,将线程池最大值增加到大约 35,并且已经完成它们都在 399 毫秒内。
考虑以下任何未来决定都会增加您的线程池压力。
您的设置应该抛出一个 IllegalStateException,表明您的配置非常低。
java.lang.IllegalStateException: Insufficient threads: max=8 < needed(acceptors=1 + selectors=8 + request=1)
既然您说您正在使用 Spring,请考虑关注有关此问题的公开问题
https://github.com/spring-projects/spring-boot/issues/8917
这里有一些关于调整最大线程数的一般(大手挥手)建议......
我们所知道的使用 Jetty 的最小网站使用 19MB 内存,并且在其线程池中配置了 8 个最大线程。(它是挪威偏远地区的一个气象站)
我们所知道的最大的使用 Jetty 的单机网站使用 189GB 内存,在 30 核机器上,最大配置 30,000 个线程,有 8 个网络接口,每个都启用 HTTP/1.x 和 HTTP/2,做 SSL + Gzip + WebSockets,在任何时刻平均有 280,000 个活动连接(在一天中的某些时间,每天的活动连接达到峰值,略低于 800,000 个)
| 归档时间: |
|
| 查看次数: |
2266 次 |
| 最近记录: |