码头,我的五个线程在哪里?

时间:2017-05-18 11:37:11

标签: java multithreading jetty

我正在使用spring + 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,它只处理两个连接。 当我说处理时,我的意思是,它接受连接,但什么都不做。不回复,不会中止。 (我认为他们在队列中)
  4. 那么,我的5个帖子在哪里?

1 个答案:

答案 0 :(得分:4)

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

你也没有考虑到线程池中的系统/硬件效果(你有多少cpu核心?是的,这很重要)。

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

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

提示:您正在使用现代Web浏览器在stackoverflow上查看的网页将使用来自线程池的9到18个活动线程,将线程池最大增加到大约35,并且会有他们都在399ms完成了。

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

  • 使用jetty-proxy:AsyncProxyServlet,AsyncMiddlemanServlet
  • 在服务器端使用WebSockets。
  • 使用WebSocket客户端
  • 使用Http Clients
  • 启用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(取决于您的负载配置文件)

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

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