我需要创建大量的线程来对数据进行一些处理。并且性能问题很少。有关如何改进此代码的任何建议都是受欢迎的。
线程的输入是字符串和数据列表。列表大小约为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%。资源丰富。但表现并不如预期。检查磁盘利用率,那里没有瓶颈。
有什么建议吗?