Solaris上Java线程与CPU的良好比例是多少?

Kai*_*oze 6 java multithreading

我有一个固定线程池为15的Java应用程序,该机器Solaris 10 SPARC有16个CPU.添加池大大提高了性能,但我想知道池中是否有太多线程.使用较少的线程可以提高性能,还是Solaris可以很好地完成线程调度.

假设池大量使用十五个CPU,那么其他应用程序线程因各种原因需要CPU,并发垃圾收集就是一个很好的例子.现在,池和其他应用程序线程共享五个CPU.然后,一到七个CPU变为空闲,Solaris会将繁忙CPU上的线程共享时间移动到空闲CPU吗?

如果不是,那么保持池大小更小是否更好,以便其他应用程序线程总是有空闲的CPU?使问题更加复杂的是,CPU的使用在应用程序中是非常零星的.

Tob*_* P. 5

如果您只执行 CPU 密集型任务(无 IO),则 N+1 个线程(其中 N 是内核数)将为您提供最佳处理器利用率。
+1 因为您可能会出现页面错误,因此在同步过程中可能会因任何原因或一小段等待时间而暂停 therad。

对于执行 IO 的线程来说,这并不容易,您必须测试最佳大小。Java concurrency in practice
一书建议将此算法作为起点:

N = number of CPUs
U = target CPU utilization (0 <= U <= 1)
W/C = ration of wait time to cpu time (measured through profiling)

threads = N * U * (1 + W/C)
Run Code Online (Sandbox Code Playgroud)

IBM 在他们的文章Java 理论与实践中使用了相同的算法:线程池和工作队列,具有固定的 U=1。N+1 事实也可以在 IBM 文章中阅读,以提供这两个论点的起源。