目前我正在开发一个可以在多线程模式下工作的应用程序。作为我本地机器(Intel Core I5)测试的一部分,我测试了4个线程。但是现在想要发布用于强烈(回归)测试的代码,因此我们可以通过任何硬性规则来决定要为处理创建的线程数。
我没有使用任何网络或应用程序服务器,而是我编写了我的逻辑来接收请求然后处理它。现在在处理过程中,我收到主线程上的请求,然后我将调用提交到ExecuterService
我需要决定线程数,然后我处理请求,每个线程再次能够返回响应
我需要配置最佳线程数。我正在尝试使用40GB内存Linux机器在16-Core上部署我的应用程序。
由于
答案 0 :(得分:2)
理论上,最佳线程数等于机器中的核心数。 实际上,许多操作都在等待内存,IO,网络或磁盘。
尝试只执行一个线程。如果CPU核心负载为25% - 您可以尝试创建(4 x计算机中的核心数)线程。
请注意,增加线程数将影响每个线程等待网络/磁盘/内存/ IO的时间,因此它会更复杂。
您可以做的最好的事情是基准测试:测量完成1,000,000个模拟请求所需的时间 - 给定不同数量的线程。
答案 1 :(得分:2)
无法通过一些定义良好的公式提取应用程序的最大线程数,但这取决于各种任务的性质和目标环境。
如果您的任务是CPU密集型的,那么,如果您生成太多线程,性能将会退化,因为大部分时间将用于上下文切换。
对于计算密集型任务,通用公式为Ncpus+1
。您可以使用Runtime.availableProcessors
如果您的任务是I / O密集型的,那么大多数时候您可以使用更多的线程,因为线程在阻塞任务上花费了这么多时间,所有线程将是可调度的。
因此,考虑到这些2,您应该通过分析器或其他类似工具估算compute-time vs waiting-time
。
您可以尝试各种尺寸的基准测试,直到您估算出最适合您的情况。
答案 2 :(得分:0)
取决于你的任务的cpu密集程度。但是你仍然可以将一个任务分配给一个核心。所以至少你可以创建与核心数量一样多的线程。也就是说,根据
,事情可能会变慢如果创建的线程太多,上下文切换会浪费大量时间。除非您可以根据自己的测试来制定基准测试,否则请使用threads =核心数。