我的 Java 应用程序有一个程序可以同时执行多个线程来完成一项任务。它在我的本地计算机上运行良好,因为它有 4 个内核和 8 个逻辑处理器,但是当我在云代工厂上部署我的应用程序时,它不允许创建超过 1 个线程。我调试后发现 Cloud Foundry JVM 只分配了 1 个 CPU,因此它不能同时运行多个线程。
我该如何解决这个问题?
我需要购买更多 CPU 还是有一种方法可以更改 JVM 配置来为 Java 应用程序设置多个 CPU。
我的 Java 应用程序有一个程序可以同时执行多个线程来完成一项任务。它在我的本地计算机上运行良好,因为它有 4 个内核和 8 个逻辑处理器,但是当我在云代工厂上部署我的应用程序时,它不允许创建超过 1 个线程。我调试后发现 Cloud Foundry JVM 只分配了 1 个 CPU,因此它不能同时运行多个线程。
我该如何解决这个问题?
我需要购买更多 CPU 还是有一种方法可以更改 JVM 配置来为 Java 应用程序设置多个 CPU。
在 SAP Cloud Platform Cloud Foundry 中,CPU 的数量取决于分配的内存。您可以获得 8GB RAM 和 2 个 CPU 的最大垂直扩展。请参阅下面报价中的配给。
在 Cloud Foundry 环境中,应用程序可以保证每 GB 实例内存 ¼ 个核心的 CPU 份额。由于每个应用程序的最大实例内存为 8 GB,这允许垂直扩展至 2 个 CPU。
在这里,您可以找到有关SAP Cloud Platform 配额和限制的更多信息。
这个博客提供了关于 SCP 性能测试的有趣见解
因为我已经弄清楚了这个问题,所以我正在回答我自己的问题。线程死锁是问题的根本原因。多个线程同时调用相同的方法,线程在等待对方释放锁时被困。因此,执行变得毫无反应。为了解决这个问题,我将 Callable 的调用方法中使用的所有方法更改为在方法声明中使用关键字“synchronized”进行同步。它现在在本地和云环境中运行良好。唯一我仍然不明白的是为什么死锁只发生在云环境而不是本地。我想这可能是云中不同的 JVM 配置。
@Artyom Kovalyov,这是我拆分任务以进行并行处理的方式。
final int numberOfWorkers = 4;
List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
//code here to create and add tasks to list
final List<List<Callable<Void>>> dividedTasks = Lists.partition(tasks, numberOfWorkers);
final ExecutorService executor = Executors.newFixedThreadPool(numberOfWorkers);
for (List<Callable<Void>> subsetOfTasks : dividedTasks) {
try {
// you can invoke all tasks in one go but I prefer invoking number of taks same as thread pool max thread number
executor.invokeAll(subsetOfTasks);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
executor.shutdownNow();