是否可以强制现有 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 个内核?的主要内容,如果未能解决你的问题,请参考以下文章

覆盖/强制推送 gemfury 中的现有软件包版本

在搜索现有成员的链表时返回布尔结果 - java

Python异常:ConnectionError 10054远程主机强制关闭现有连接

是否可以更新 ElasticSearch 6.x 索引中现有字段映射的“存储”值?

公网ip被X网站限制访问,现有啥手段可以继续访问X网站?

Maven - 强制使用依赖