是否可以强制现有 Java 应用程序使用不超过 x 个内核?
Posted
技术标签:
【中文标题】是否可以强制现有 Java 应用程序使用不超过 x 个内核?【英文标题】:Is it possible to force an existing Java application to use no more than x cores? 【发布时间】:2012-02-11 13:32:01 【问题描述】:我们正在对现有 Java 程序进行基准测试。它们是线程应用程序,旨在从多核 CPU 中受益。我们想衡量内核数量对运行速度的影响,但我们不愿意(也无法)更改这些应用程序的代码。
当然,我们可以在不同的机器上测试软件,但这既昂贵又复杂。我们宁愿有一个软件解决方案。
注意:您可以假设测试平台是 Windows、Linux 或 Mac。理想情况下,我们希望能够在其中任何一个平台上运行测试。
【问题讨论】:
我不认为它是在java程序中控制的,我猜这是纯粹的操作系统特定的决定。我很想看到专家对这个问题发表评论。 如果您需要一些定制软件解决方案/定制,这很可能会比硬件本身贵得多。而且我不确定您是否可以强制Java程序在任何时候只使用一个内核。 OS/JVM相关的东西 考虑在 VirtualBox 这样的虚拟机中运行。然后,您有一个简单的 GUI 来确定实例可用的 cpu 功率。 【参考方案1】:这称为设置 CPU 亲和性,它是针对进程的操作系统设置,并非特定于 Java。
在 Linux 上:http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html
在 Windows 上:http://www.addictivetips.com/windows-tips/how-to-set-processor-affinity-to-an-application-in-windows/
在 Mac 上,您似乎无法设置它:https://superuser.com/questions/149312/how-to-set-processor-affinity-on-os-x
【讨论】:
另外,请查看 github.com/peter-lawrey/Java-Thread-Affinity 以获取可以帮助您进行测试的 java 库。 另外(尽管这可能与实现有关),如果您在调用Runtime.getRuntime().availableProcessors()
之前设置CPU亲和性,此方法将反映更改并返回(减少的) JVM可用的核心数——完全符合其javadoc。【参考方案2】:
把问题颠倒过来;与其弄清楚如何将应用程序限制为仅在 m 核心机器上使用 n 个核心,不如弄清楚如何确保只有 n 可用于您的应用程序的内核。您可以编写一个非常简单的程序,通过执行while (true);
之类的操作来占用一个内核,并启动该程序的 m-n 个实例以最高优先级运行,从而确保您的代码只有 n 个可用内核。
或者,如果您的 Bios 或操作系统允许禁用 CPU 内核,那么也可以。我知道 Mac OS X 上的 CHUD 工具曾经可以做到这一点,但自 G5 时代以来我没有接触过这些工具,所以这可能不再起作用了。
【讨论】:
以上是关于是否可以强制现有 Java 应用程序使用不超过 x 个内核?的主要内容,如果未能解决你的问题,请参考以下文章
Python异常:ConnectionError 10054远程主机强制关闭现有连接