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