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