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个核心上运行此应用程序是极速减慢整个应用程序.
非常感谢帮助:)
请记住,它是操作系统而不是 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)
归档时间: |
|
查看次数: |
5292 次 |
最近记录: |