gpt4 book ai didi

java - 追踪java中的线程冲突

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:02 26 4
gpt4 key购买 nike

我使用 YourKit 计量了一个应用程序,并确定了主要的 CPU 接收器。我将计算结构化为通过具有固定线程数的 ExecutorService 对其进行并行化。

在 24 核机器上,添加线程的好处在超过 4 个时会很快衰减。所以,我想,这里一定存在一些争用或锁定,或者 IO 延迟,或其他问题。

好的,我打开了 YourKit 的“监控使用情况”功能,工作线程中显示的阻塞时间量微不足道。观察线程状态图表,工作线程几乎都是“绿色”(运行),而不是黄色(等待)或红色(阻塞)。

CPU 分析仍然显示 96% 的时间在工作线程内的调用树中。

所以有些东西正在实时耗尽。会不会是调度开销?

在伪代码中,您可以将其建模为:

loop over blobs:
submit tasks for a blob via invokeAll of executor
do some single-threaded processing on the results
end loop over blobs

在一次测试运行中,有大约 680 个 blob,以及大约 13 个任务/blob。因此每个线程(假设有四个)为每个 blob 调度大约 3 次。

硬件:我在我的 MacBook pro 上进行了小规模的测试,然后在大胖戴尔上进行了测试:linux 上的 hwinfo 报告了 24 个不同的 --cpu 项,由

Intel(R) Xeon(R) CPU           X5680  @ 3.33GHz

Intel 的网站告诉我每个都有 6 个内核,12 个线程,我怀疑我有 4 个。

最佳答案

假设您有 4 个核心,每个核心有 8 个逻辑线程,这意味着您有 4 个真正的处理单元,可以在 32 个线程之间共享。这也意味着当您在同一个内核上有 2-8 个 Activity 线程时,它们必须竞争资源,例如 CPU 管道以及指令和数据缓存。

当您有许多线程必须等待磁盘或网络 IO 等外部资源时,此方法效果最佳。如果您有 CPU 密集型进程,您可能会发现每个内核一个线程将使用您拥有的所有 CPU 能力。

我编写了一个库,它支持为 linux 和 windows 分配线程和内核。如果您有 Solaris,它可能很容易移植,因为它支持 JNI posix 调用和 JNA 调用。

https://github.com/peter-lawrey/Java-Thread-Affinity

关于java - 追踪java中的线程冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9367767/

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