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

标签 java multithreading performance jvm executor

我在使用 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/

相关文章:

php - 如何处理从一个客户端到一个 PHP 脚本的多个并行请求

c# - 寻求解释/信息 : Windows write I/O performance with "fsync" (FlushFileBuffers)

python - 如何提高数组大小 9e3 的列表理解速度?

java - JDB 中 GDB 'start' 的等价物?

java - 第二个线程没有输出消息

c++ - 无法关闭 QThread - 应用程序崩溃

objective-c - 从NSTimer的调用方法中使其无效

java - 如何在 portlet 中使用 Liferay 内部代码?

java - 在 spring boot 应用程序中使用默认和自定义 liquibase 配置

java - DB2 查询似乎挂起