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

标签 java multithreading jetty

我正在使用 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;
}

它有效,但很奇怪。

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

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

最佳答案

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

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

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

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

提示:您现在在 stackoverflow 上查看的网页,使用现代 Web 浏览器,会使用线程池中的 9 到 18 个 Activity 线程,并将线程池的最大值增加到大约 35,并且会在 399 毫秒内全部完成。

请考虑以下任何 future 决策都会增加您的线程池压力。

  • 使用 jetty 代理: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 少
  • 较小的网络资源规模倾向于较低的最大线程数
  • 大型或持续时间长的网络资源倾向于更大的最大线程数
  • 使用 Servlet 3.1+ 异步 I/O 意味着更少的最大线程数(仅在实际需要读取和/或写入时才使用线程)
  • 使用 Servlet 3.0(或更早版本)阻塞 I/O 意味着更多最大线程(必须将线程专用于每个连接读/写)
  • 一个普通网站的最大线程数为 200 到 500 个,具有平均负载、平均网络资源大小和平均网络资源时序,使用 HTTP/1.x
  • 对于使用许多功能(代理、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 个网络接口(interface),每个接口(interface)都启用 HTTP/1.x 和 HTTP/2,做SSL + Gzip + WebSockets,任一时刻平均有 280,000 个 Activity 连接(每天特定时间的峰值接近 800,000 个 Activity 连接)

关于java - Jetty,我的五个线程在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44046685/

相关文章:

java - 以编程方式访问 JMX 控制台的简单方法

java - Java中有没有函数可以直接删除一行中包含3个数据的索引?

Javacard - 使用明文 pin 以外的其他方式保护 RSA 私钥?

java - 没有 volatile 示例的损坏的单例

java - 我将如何使用 NSTask 运行 .sh 文件并获取其输出?

java - org.apache.catalina.core.ContainerBase : A child container failed during start

java - 过渡和 fragment

java - 如何使用带有 "select"关键字的 MySql 存储过程迭代 ResultSet?

multithreading - F# 事件的线程安全引发

java - 以下类中的对象是不可变的吗?