Java多线程应用程序仅使用一个Core

hof*_*x91 6 java performance multithreading jvm executor

我的JVM在带有openJDK 1.7.0_51 64Bit的CentOS 6.0上运行时遇到问题.我的系统是一个4核系统,8GB Ram.

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

我实例化了4个实现"Runnable"接口的Worker.然后我使用线程池执行Thread.这是我的代码:

 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);
   }
 }
Run Code Online (Sandbox Code Playgroud)

运行它时,使用参数4,它将在Threadpool中生成4个Threads.我假设JVM或我的操作系统足够聪明,可以在我的所有内核上安排这些线程.但是,只有我的cpu的一个核心工作在100%,其他核心几乎都处于空闲状态.

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

非常感谢帮助:)

ali*_*der 3

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

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

/proc/cpuinfo
lscpu
nproc
Run Code Online (Sandbox Code Playgroud)

安装 schedutils 以配置处理器关联性

yum install schedutils  
Run Code Online (Sandbox Code Playgroud)

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

taskset -c 2 -p 23564
Run Code Online (Sandbox Code Playgroud)

  • jvm 不控制 cpu 亲和性 - 它是操作系统。您也许可以使用 schedutils 在云虚拟机上更改它,尽管我不完全确定 - Viel Glück! (2认同)