Java巨大的线程池性能问题

时间:2016-12-25 22:09:09

标签: java multithreading performance threadpool

我需要创建大量的线程来对数据进行一些处理。并且性能问题很少。有关如何改进此代码的任何建议都是受欢迎的。

线程的输入是字符串和数据列表。列表大小约为100万个自定义对象。来自列表的数据由每个线程根据输入的数据串处理。单个任务不会更新列表中的任何内容。他们只是根据需要获取数据并处理数据。磁盘利用率几乎不到3-5%,这不是瓶颈。 MySQL已相应调整以确保最佳性能。

ThreadPoolExecutor lt_segThreadExecutor = (ThreadPoolExecutor) 
                                            Executors.newFixedThreadPool(28);

int counter = 0; 
for (String temp : lc_Data){
    ++counter; 
    lt_segThreadExecutor.execute(new SegregateData (temp,                                                            lc_Data) ); // Inputs are java containers. A list. Nothing is modified by any threads. List size is around 1 million entries. 
    if ((counter % (size / 10)) == 0 ){
        System.out.println("Completed processing for : " + counter + " % of data");
    }
}


lt_segThreadExecutor.shutdown();
try {
    lt_segThreadExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} 
catch (InterruptedException e) {
      System.out.println("Exception Occured.");
}

我正在使用固定大小的线程池。是的,有28个物理核心。需要完成的任务总数约为50-75,000。因此,循环将持续近50至75K。

线程中没有sysout。线程不会向任何日志文件写入任何内容。他们进入DB。 DB位于NVME SSD上。因此,线程之间没有等待资源。所有任务都是独立的。每个过程数据都基于参数值传递。

问题: 这个代码在四核I7机器上需要大约44分钟。在具有28个核心的服务器上需要大约32分钟。 可用内存:16 Gigs可用。 将xms大小增加到8演出。仍然没有改善。 CPU利用率约为95%。资源丰富。但表现并不如预期。检查磁盘利用率,那里没有瓶颈。

有什么建议吗?

0 个答案:

没有答案