如何选择HTTP servlet容器的最大线程数?

时间:2008-09-19 10:43:35

标签: java http optimization servlets concurrency

我正在开发一个在Jetty中作为servlet(使用阻塞IO)运行的restful Web服务。找出最大线程的最佳设置似乎很难。

是否有研究公式用于从其他设置的某些易于测量的特征中确定最大线程数?

6 个答案:

答案 0 :(得分:3)

非常简单和原始的一个:

max_number_of_threads = number_of_CPUs * C

C取决于您申请的其他因素: - )

问自己以下问题:

  • 您的应用程序是CPU密集型(较低的C)还是花费大部分时间等待第三个系统(较高的C)?
  • 您是否需要更快的响应时间(更低的C)或者能够同时为多个用户提供服务,即使每个请求需要更长时间(更高的C)。

通常我将C设置得相当低,例如2 - 10.

答案 1 :(得分:1)

不,没有。保持线程数量受限并受到控制,以免您超出系统资源,Java的限制通常约为100-200个活动线程。

这样做的好方法是使用 java.util.concurrent 中的执行程序。

答案 2 :(得分:1)

据我所知,当问到这个问题时,Servlet 3.0还没出来。但我想我应该在这个问题中记录使用Servlet 3.0在Servlet容器中进行异步处理的可能性。这可能会帮助遇到此问题的人。 毋庸置疑,Servlet 3.0有足够的资源可以指出主要的servlet线程现在压力较小! Jetty有Async版本,以防万一本身不想使用Servlet 3.0 API。

答案 3 :(得分:0)

答案取决于您希望处理的最大并发连接数。您应该允许尽可能多的线程作为您期望的连接。

andreasmk2关于线程数不正确。我运行了1000个线程的应用程序,没有系统资源问题;当然这取决于您系统的具体细节。您将遇到系统限制,而不是 Java 限制。

答案 4 :(得分:0)

我的问题是我不知道如何对同时连接的数量形成合理的期望。大概在某些点,最好拒绝新的连接,而不是让一切都变慢,因为有太多的请求被提供服务。

现实的工作量很难模拟,这就是为什么我在寻找已经被其他人研究过的公式。

(明显的上限是最大堆大小除以服务请求所需的最小内存量,但即使在具有垃圾收集器的环境中也很难测量。)

答案 5 :(得分:0)

感谢。我读到这个,因为没有任何简单的公式。 : - (

(我的应用程序是一个HTML5验证器。有时它显然在外部服务器上等待。但是,很难确定它实际上是CPU本身还是通过垃圾收集器。)