我正在开发一个在Jetty中作为servlet运行的restful Web服务(使用阻塞IO)。找出最大线程的最佳设置似乎很难。如何选择HTTP Servlet容器的最大线程数?
是否有一个研究公式用于从其他设置的某些易测量特性中确定最大线程数?
我正在开发一个在Jetty中作为servlet运行的restful Web服务(使用阻塞IO)。找出最大线程的最佳设置似乎很难。如何选择HTTP Servlet容器的最大线程数?
是否有一个研究公式用于从其他设置的某些易测量特性中确定最大线程数?
非常简单和原始之一:
max_number_of_threads = number_of_CPUs * C
其中C依赖于应用程序的其他因素:-)
问自己以下几个问题:
通常我将C设置的很低,例如, 2 - 10.
不,没有。让你的线程数量受限制并受到控制,这样你就不会超出系统资源,Java的限制通常在100-200线程左右。
好办法是使用的执行程序java.util.concurrent。
答案取决于您希望处理的同时连接的最大数量。您应该允许与期望的连接数相同的线程数。
andreasmk2关于线程数不正确。我已经运行1000个线程的应用程序,并没有系统资源的问题;当然这取决于你的系统的具体情况。您会碰到一个限制,而不是Java限制。
我的问题是,我不知道如何对同时连接的数量形成合理的期望。据推测,在一些点拒绝新连接比让所有事情放慢,因为有太多的请求被服务。
逼真的工作负载很难模拟,这就是为什么我正在寻找一个已经被别人研究过的公式。
(最明显的上限是最大堆大小通过为请求服务所需的存储器的最小量除以,但即使是难以与垃圾收集器的环境中进行测量。)
谢谢。由于没有任何简单的公式,我读了这个。 :-(
(我的应用程序是一个HTML5验证。有时,它显然是在外部服务器上等待着。然而,这是难以确定时,它实际上是CPU密集型的,可单独或通过垃圾收集器。)
我明白在问这个问题的时候,Servlet 3.0还没有出来。但我认为我应该在这个问题中记录使用Servlet 3.0在Servlet容器中进行异步处理的可能性。这可能会帮助遇到此问题的人。不用说,Servlet 3.0有足够的资源,指出主要的servlet线程现在没有压力了! Jetty有异步的对应物,以防万一不想使用Servlet 3.0 API本身。