【发布时间】:2010-09-11 04:33:50
【问题描述】:
我正在开发一个在 Jetty 中作为 servlet(使用阻塞 IO)运行的宁静 Web 服务。找出最大线程数的最佳设置似乎很难。
是否有研究公式可以根据其余设置的一些易于测量的特征来确定最大线程数?
【问题讨论】:
标签: java http optimization servlets concurrency
我正在开发一个在 Jetty 中作为 servlet(使用阻塞 IO)运行的宁静 Web 服务。找出最大线程数的最佳设置似乎很难。
是否有研究公式可以根据其余设置的一些易于测量的特征来确定最大线程数?
【问题讨论】:
标签: java http optimization servlets concurrency
非常简单原始的一种:
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 个线程的应用程序并且系统资源没有问题;当然,这取决于您系统的具体情况。您会遇到 system 限制,而不是 Java 限制。
【讨论】:
我的问题是我不知道如何对同时连接的数量形成合理的期望。大概在某个点,拒绝新连接比让一切慢下来要好,因为有太多的请求正在被服务。
现实的工作负载很难模拟,这就是为什么我要寻找其他人已经研究过的公式。
(明显的上限是最大堆大小除以服务请求所需的最小内存量,但即使在具有垃圾收集器的环境中也很难衡量。)
【讨论】:
谢谢。我读了这篇文章,因为没有任何简单的公式。 :-(
(我的应用程序是一个 HTML5 验证器。有时它显然在等待外部服务器。但是,很难确定它本身或通过垃圾收集器实际上何时受 CPU 限制。)
【讨论】: