Java 运行web服务请求的线程池的合理线程数

Java 运行web服务请求的线程池的合理线程数,java,web-services,concurrency,threadpool,Java,Web Services,Concurrency,Threadpool,在Java中创建FixedThreadPool执行器对象时,需要传递一个参数,该参数描述执行器可以并发执行的线程数。我正在构建一个服务类,其职责是处理大量电话号码集合。对于每个电话号码,我需要执行web服务(这是我的瓶颈),然后将响应保存在hashmap中 为了减少这个瓶颈对我的服务性能的危害,我决定创建一个工人类来获取未处理的元素并对其进行处理。工人类实现可运行接口,我使用Executor运行工人 可以同时运行的工作线程数取决于Executor FixedThread池的大小。线程池的安全大小

在Java中创建FixedThreadPool执行器对象时,需要传递一个参数,该参数描述执行器可以并发执行的线程数。我正在构建一个服务类,其职责是处理大量电话号码集合。对于每个电话号码,我需要执行web服务(这是我的瓶颈),然后将响应保存在hashmap中

为了减少这个瓶颈对我的服务性能的危害,我决定创建一个工人类来获取未处理的元素并对其进行处理。工人类实现可运行接口,我使用Executor运行工人


可以同时运行的工作线程数取决于Executor FixedThread池的大小。线程池的安全大小是多少?当我以某个大数字作为参数创建FixedTheradPool时会发生什么情况?

我在某个地方读到,最佳线程数是核心数*25。似乎.NET将此用作线程池的默认设置。但是,如果有大量web服务调用,最好使用单个线程并检查web服务调用列表以获得响应。当响应到达时,只需处理条目并将其从列表中删除。

如果每个工作线程都需要进行web服务调用,则池中的线程数应受到web服务可以处理的并发请求数的强烈影响。任何其他线程都不会超过Web服务。

如果您有DEV访问Web服务,请考虑创建一个批处理函数来检查一次调用中的多个电话号码。 在较新的.NET中,有一个线程池,它可以根据自己的性能配置文件进行增长和收缩。不幸的是,Java的版本要么是固定的,要么是根据即将到来的工作增长到一定的极限

我们曾经有过类似的担忧。我们的解决方案是允许客户根据自己的喜好调整池大小和性能


I/O操作池大小可以考虑一些网络和数据属性:网络带宽、消息大小、web服务的处理时间和样式、本地核心数。

如果每次计算相当于对web服务的调用,然后,您应该考虑您在该服务上加载了多少负载/服务将容忍或将被服务所有者允许的多个并发连接。大多数可公开访问的服务一次只能从任何单个用户获得一个这样的连接。如果可能,请联系服务所有者了解其使用策略。此类连接的数量将决定您可以使用的线程数量。

不要忘记,您创建的每个线程也会对其堆栈大小的内存提出要求。因此,创建线程池会影响进程的内存占用(请注意,有些池在实际需要线程之前不会创建线程,因此在启动时不会看到任何内存增加)


此堆栈大小可通过
-Xss
进行配置(类似于
-Xmx
等)。我相信默认值是每个线程512Kb。目前我找不到任何权威机构来证实这一点。

我想知道您是否最好使用NIO而不是线程,因为您的限制因素将是web服务服务器+网络瓶颈,而不是客户端CPU


否则,,最多不应超过web服务所能支持的并发连接数。

如果要进行大量计算(例如并行阵列操作),那么经验法则是线程数与处理器数相等。

让我们假设web服务是无限可伸缩的,没有人是可伸缩的我会注意到你在用请求发送垃圾邮件。我们还假设web服务响应在1秒范围内,而本地处理时间为5毫秒

当您拥有与处理内核相同数量的繁忙线程时,吞吐量将最大化

在这些假设下,对于任何大小的线程池,您都无法在多核处理器上最大化吞吐量。要实现每秒最大事务数,必须中断每个连接的线程模型。寻找前面提到的非阻塞I/O(NIO)或异步完成令牌模式(Windows中的IO完成)的Java实现


请注意,为每个创建的线程保留的堆栈内存实际上只是保留的地址空间,而不是实际分配或提交的内存。当堆栈尝试增长时,抛出异常,这导致堆栈内存按需提交。结果是,它只与32位内存管理器真正相关。对于64位内存,您有一个巨大的地址空间,即使您只使用物理内存备份该空间的一小部分。至少,这是我对Windows工作原理的理解,我对Unix世界不太清楚。

可以考虑的是

Runtime.getRuntime().availableProcessors()

它给出了一个对系统有意义的线程的一些指导。

你好,米迦勒,有几点:你认为“大量的电话号码”?您的应用程序将运行的系统规格是什么?当使用批处理特定的线程时,可用的内存量。堆和处理器速度也被考虑在计算中。祝你好运,Kam。除此之外,请阅读这里的类比:看看你的应用程序是否适合固定线程池。它将收集程序需要的更多责任,他需要的是更大的进程吞吐量。对于cores*25 num。http行为就像他的FixedThreadPool,无需担心调用和获取响应。存在的主要问题是大规模hes处理的规模、内存利用率。是的,在Linux上,每个线程都有自己的线程