gpt4 book ai didi

Java多线程应用程序只使用一个核心

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:42 25 4
gpt4 key购买 nike

我在使用 openJDK 1.7.0_51 64 位的 CentOS 6.0 上运行的 JVM 出现问题。我的系统是 4 核系统和 8GB 内存。

我正在运行我自己编写的 Java 多线程应用程序。它应该将大量数据插入 NoSQL 数据库。为此,我使用 java.concurrent.Executors 中的“CachedThreadPoolExecutor”产生了 4 个线程。

我实例化了 4 个实现“Runnable”接口(interface)的 Worker。之后我使用线程池执行线程。这是我的代码:

 public void startDataPump(int numberOfWorkers){
//class "DataPump" implements runnable
for (int i = 0; i < numberOfWorkers; i++){
DataPump pump = new DataPump();
//"workerList" contains all workers and is a simple arrayList to keep track of the workers
workerList.add(pump);
//"workers" is the thradpool that has been
//initialized earlier with "Executors.newCachedThreadPool()
workers.execute(pump);
}
}

运行时,使用参数 4,它将在线程池中生成 4 个线程。我假设 JVM 或我的操作系统足够智能,可以在我的所有内核上安排这些线程。但是,我的 cpu 只有一个内核以 100% 的速度工作,其他内核几乎处于闲置状态。

我的代码是不是做错了什么,或者这是一个 JVM/OS 问题。如果是这样,我能做些什么吗?仅在 1 个核心上运行此应用程序会极大地减慢整个应用程序的速度。

非常感谢帮助:)

最佳答案

请记住,它是操作系统而不是 JVM 负责 CPU 亲和性 - 这就是为什么我建议您首先弄清楚您有多少个 CPU,然后也许使用 schedutils 为特定进程配置处理器亲和性。

cpu 信息 - 使用以下三个之一

/proc/cpuinfo
lscpu
nproc

安装 schedutils 以配置处理器关联

yum install schedutils  

您可以通过 schedutils 分配 cpu affinity,如下所示(2 是第二个 proceccor,23564 是进程 ID):

taskset -c 2 -p 23564

关于Java多线程应用程序只使用一个核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21289922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com