我已阅读多个关于如何决定线程池大小的问题和文章。这些问题包括:
文章包括:
然而,这些都没有直接解决超线程在Intel芯片上的问题。
在启用超线程的计算机上,当决定线程池大小时,我应该考虑虚拟核心吗?
例如,在Java Concurrency In Practice一书中,Brian Goetz建议对于CPU密集型应用程序,通常可以考虑使用
此外,应用程序的性质在如何考虑超线程核心方面有多大的差异?
与上面提到的相反,我的应用程序不是CPU受限的。相反,我的应用程序是一个服务器端Vaadin应用程序,其中线程通过JDBC每分钟多次进行Internet连接并访问本地数据库。鉴于超线程基本上是附加到同一核心的第二组寄存器,也许一个CPU受限的应用程序应该考虑仅使用真实核心,而一个网络/IO受限的应用程序应该考虑虚拟核心?
最后,英特尔芯片的类型是否会影响超线程,从而影响线程池大小的计算?具体而言,Xeon和Core i7/i5之间在这个问题上是否有区别?例如,当前的MacBook(Core i7)和Mac Pro(Xeon)之间的区别。
我意识到涉及许多变量,这是一个复杂的话题。没有完全精确的答案。我只是希望得到一些通用规则和建议,以帮助像我这样对此类硬件问题不太熟悉的程序员。
在启用超线程的计算机上,当决定线程池大小时,我应该考虑虚拟核心吗?
例如,在Java Concurrency In Practice一书中,Brian Goetz建议对于CPU密集型应用程序,通常可以考虑使用
(# of cores + 1)
作为线程数。对于一个带有4个真实核心和8个虚拟(超线程)核心的Intel Core i7芯片,该公式应该是(4 + 1)
还是(8 + 1)
?此外,应用程序的性质在如何考虑超线程核心方面有多大的差异?
与上面提到的相反,我的应用程序不是CPU受限的。相反,我的应用程序是一个服务器端Vaadin应用程序,其中线程通过JDBC每分钟多次进行Internet连接并访问本地数据库。鉴于超线程基本上是附加到同一核心的第二组寄存器,也许一个CPU受限的应用程序应该考虑仅使用真实核心,而一个网络/IO受限的应用程序应该考虑虚拟核心?
最后,英特尔芯片的类型是否会影响超线程,从而影响线程池大小的计算?具体而言,Xeon和Core i7/i5之间在这个问题上是否有区别?例如,当前的MacBook(Core i7)和Mac Pro(Xeon)之间的区别。
我意识到涉及许多变量,这是一个复杂的话题。没有完全精确的答案。我只是希望得到一些通用规则和建议,以帮助像我这样对此类硬件问题不太熟悉的程序员。