我有一个并行运行(全天)任务的程序(要执行的任务中没有I / O)所以我使用Executors.newFixedThreadPool(poolSize)
来实现它。
最初我将poolSize
设置为Runtime.getRuntime().availableProcessors()
,但我有点担心使用所有可用内核,因为在同一台PC上运行其他进程(32个内核)。
特别是我有十个其他JVM运行相同的程序(在不同的输入数据上),所以我有点担心在可用内核之间的线程切换方面可能会有很多开销,这可能会减慢总体计算。
如何确定每个程序/ JVM的池大小?
此外,在我的电脑中,还有其他进程一直在运行(防病毒,备份等)。我也应该考虑这些吗?
答案 0 :(得分:1)
任何建议都取决于您的具体情况。 32个核心上的10个JVM将建议每个3个线程(忽略垃圾收集线程,计时器任务等......)
您还有其他任务在运行。调度程序将确保它们正在运行,但它们是否必须响应?比JVM响应更快?如果您正在运行Linux / Unix,那么您也可以使用优先级(通过nice
)来确保特定进程不会占用CPU。
最后你运行了10个JVM。会导致分页吗?如果是这样,那将是缓慢的,你可能最好少运行更少的JVM,以避免消耗这么多内存。
确保您的关键变量已公开并可配置,并测量各种方案以找到最佳方案。
答案 1 :(得分:1)
如何确定每个程序/ JVM的池大小?
您需要的线程数将使您的利用率接近99%而不会更多。
平衡工作的最简单方法是让进程运行一次,同时处理多个文件并只使用一个线程池。如果需要通过命令行启动文件,可以将进程设置为服务。
如果出于某种原因这是不可能的,那么您需要猜测线程池应该缩减多少。尝试运行一个进程并查看利用率。如果一个人说40%,那么我怀疑十个过程被400%过度使用。那么你可以将池大小减少4倍。
答案 2 :(得分:0)
不幸的是,这很难知道,因为程序通常不知道在同一个盒子上还有什么或可能会发生什么。
“简单”的出路是使池大小可配置。这允许控制程序/框的用户决定分配给程序的线程数(可能使用他们对框的一般工作负载的了解)。
更复杂的解决方案是尝试以编程方式确定框的当前工作负载,并从中适当选择池大小。此解决方案的功效取决于您确定工作负载的准确程度,并可能随着时间的推移而适应。
答案 3 :(得分:0)
尝试点击进程,检查top /任务管理器和性能监视器,以验证此实现是否实际影响了您的计算机。
本文似乎包含有关您要实现的内容的有趣信息: http://www.ibm.com/developerworks/library/j-jtp0730/index.html