我的Java应用程序有一个程序,可以同时执行多个线程来完成任务。它在我的本地电脑上运行得非常好,因为它有4个核心和8个逻辑处理器,但当我在云计算上部署我的应用程序时,它不允许创建超过1个线程。我调试发现Cloud Foundry JVM只分配了1个CPU,因此它不能同时运行多个线程。
我如何解决这个问题?
我是否需要购买更多的CPU,或者有一种方法可以更改JVM配置来为java应用程序设置多个CPU。
发布于 2020-07-25 16:16:03
在SAP Cloud Platform Cloud Foundry中,CPU的数量取决于分配的内存。您可以获得的最大垂直扩展为8 8GB和2个CPU。请参阅下面报价中的配给。
在Cloud Foundry环境中,应用程序可以获得每GB实例内存1/4核的
保证份额。由于每个应用程序的最大实例内存为8 GB,因此允许垂直扩展到最多2个CPU。
在这里你可以在quotas and limitations of SAP Cloud Platform上找到更多。
This blog提供了关于SCP性能测试的有趣见解。
要更新您的配额,请转到您的应用程序的概述部分,并按照屏幕截图上的步骤操作:
发布于 2020-08-20 02:01:45
我正在给我自己的问题一个答案,因为我已经弄清楚了这个问题。线程死锁是问题的根本原因。多个线程同时调用相同的方法,线程在等待对方释放锁时被捕获。因此,执行变得无响应。为了修复它,我更改了Callable的call method中使用的所有方法,以便在方法声明中使用关键字"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();
https://stackoverflow.com/questions/63073603
复制