Jetty,我的五个线程在哪里?

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)

它有效,但很奇怪。

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

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

Joa*_*elt 5

您没有考虑每个连接器如何将选择器和接受器分配到同一个线程池中。

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

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

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

提示:您现在正在查看的网页,在 stackoverflow 上,使用现代网络浏览器,会使用线程池中的 9 到 18 个活动线程,将线程池最大值增加到大约 35,并且已经完成它们都在 399 毫秒内。

考虑以下任何未来决定都会增加您的线程池压力。

  • 使用jetty-proxy:AsyncProxyServlet、AsyncMiddlemanServlet
  • 在服务器端使用 WebSockets。
  • 使用 WebSocket 客户端
  • 使用 Http 客户端
  • 启用 HTTP/2

您的设置应该抛出一个 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

这里有一些关于调整最大线程数的一般(大手挥手)建议......

  • 活动中的连接数是您的基线,从最大线程数开始,然后从那里向上移动。
  • HTTP/1.x 使用的线程少于 HTTP/2
  • 较小的 Web 资源大小倾向于较低的最大线程
  • 大型或长时间的 Web 资源倾向于更大的最大线程
  • 使用 Servlet 3.1+ 异步 I/O 意味着更少的最大线程数(仅在需要实际读取和/或写入时使用线程)
  • 使用 Servlet 3.0(或更旧)阻塞 I/O 意味着更多的最大线程(必须将线程专用于每个连接读/写)
  • 使用 HTTP/1.x 的平均网站的最大线程数为 200 到 500 个,具有平均负载、平均 Web 资源大小和平均 Web 资源计时
  • 对于使用许多功能(代理、websockets、httpclient、http/2)的大型网站,典型的最大线程配置为 3,000 到 5,000。
  • 对于极端网站,尽可能多地使用 CPU 内核,专门使用 Servlet 3.1 异步 I/O,将您的线程最多设置为 9,000 到 20,000(取决于您拥有的负载配置文件)

我们所知道的使用 Jetty 的最小网站使用 19MB 内存,并且在其线程池中配置了 8 个最大线程。(它是挪威偏远地区的一个气象站)

我们所知道的最大的使用 Jetty 的单机网站使用 189GB 内存,在 30 核机器上,最大配置 30,000 个线程,有 8 个网络接口,每个都启用 HTTP/1.x 和 HTTP/2,做 SSL + Gzip + WebSockets,在任何时刻平均有 280,000 个活动连接(在一天中的某些时间,每天的活动连接达到峰值,略低于 800,000 个)