gpt4 book ai didi

java - 为什么我的 java 长时间运行的线程(5k+ 线程)没有利用所有机器内核(12 核)?

转载 作者:行者123 更新时间:2023-11-29 06:27:44 29 4
gpt4 key购买 nike

我写了一个简单的多线程 Java 应用程序,主要方法只创建 5k 个线程,每个线程将循环处理一个包含 5M 条记录的列表。

我的机器规范:

  • CPU 内核:12 个内核
  • 内存:13Gb RAM
  • 操作系统:Debian 64 位

我的 jar 现在正在运行,我使用 hTop 来监视我的应用程序,这是我在运行时可以看到的内容

enter image description here

这就是我构建线程的方式:

ExecutorService executor = Executors.newCachedThreadPool();
Future<MatchResult> future = executor.submit(() -> {
Match match = new Match();
return match.find(this);
});

匹配类

find(Main main){
// looping over a list of 5M
// process this values and doing some calculations
// send the result back to the caller
// this function has no problem and it just takes a long time to run (~160 min)
}

现在我有一些问题:

1- 根据我的理解,如果我有一个多线程进程,它将充分利用我所有的内核直到任务完成,那么为什么工作负载只有 0.5 左右(只使用了一半的内核)?

2- 为什么我的 Java 应用程序在实际运行并填满日志文件时状态为“S”( hibernate )?

3- 为什么我只能看到 5k 中的 2037 个线程正在运行(这个数字实际上比这个少,而且随着时间的推移它会增加)

我的目标:利用所有核心并尽可能快地完成所有这 5k+ :)

最佳答案

Based on my understanding if I have a multiThreaded process, it'll fully utilize all my cores until the task is completed.

你的理解不正确。在设计不佳的多线程应用程序中可能无法(全部)使用内核的原因有很多。

so why the work load is only around 0.5 (only half a core is used)?

一些可能的原因:

  1. 线程可能会死锁。
  2. 线程可能都在争用一个锁(或少量锁),导致大多数线程都在等待。
  3. 线程可能都在等待 I/O;例如从一些数据库中读取记录。

这些只是一些更明显的可能原因。

鉴于您的线程正在取得一些进展,我认为解释#2 很适合您的“症状”。


就其值(value)而言,创建 5k 线程几乎肯定是一个非常糟糕的主意。任何时候最多可能有 12 个在运行。其余的将等待运行(假设您解决了导致线程饥饿的问题)并占用内存。后者具有各种次要性能影响。

My Target: to utilize all cores and get all this 5k+ done as fast as it can be :)

这两个目标可能相互排斥 :-)


All threads are logging to the same file by a the java.util.Logger.

这可能会导致他们都争夺同一个锁……在记录器框架中的某个东西上。或日志文件的文件 I/O 瓶颈。

一般来说,日志记录是昂贵的。如果您想要性能,尽量减少日志记录,并且在日志记录必不可少的情况下,请使用不会引入并发瓶颈的日志记录框架。


解决此问题的最佳方法是剖析 代码并找出它花费大部分时间的地方。

猜测是低效的。

关于java - 为什么我的 java 长时间运行的线程(5k+ 线程)没有利用所有机器内核(12 核)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48718100/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com