C# 中的多线程 CPU 使用率

本文关键字:CPU 使用率 多线程 | 更新日期: 2023-09-27 18:32:00

我的程序使用预定数量的线程,每个线程都独立工作。我使用 i7-2600 CPU,但我关闭了超线程模块,使其在 4 个内核上运行 4 个线程。当我使用 1 个线程运行程序时,CPU 使用率为 25%,这是完美的,因为 1 个线程已完全使用,但是当我运行 4 或 3 个线程时,我只获得 60% 的 CPU,为什么?

就像我之前提到的,线程是完全独立的(没有锁和争用),当我用 4 个线程运行程序 1 次时,我得到了 100% 的 CPU 使用率(即当它的 4 个进程每个进程 1 个线程时,我得到了正确的 CPU 使用率)

有什么想法吗?

更多信息:

  1. 我不使用 I/O,同时处理所有需要的数据都加载到内存中,每个线程在处理之前加载自己的数据。
  2. 我确实从数据库加载数据(使用 oleDb),但我描述的问题发生在加载后,而所有线程都在处理(未完成加载)。
  3. 这些数字是:
    • 2 个线程大约 40% 而不是 50(每个线程 85%)。
    • 3 个线程大约 50% 而不是 75(每个线程 65%)。
    • 4 个线程大约 60% 而不是 100(每个线程 60%)。
  4. 我使用带有 7GB 内存的 i2600 16,但该过程的内存使用量并不接近。
  5. 我运行了Windows性能监视器来查找没有争用。

C# 中的多线程 CPU 使用率

您可以尝试将程序从工作站模式切换到服务器垃圾回收模式。目前,您可以只使用一个垃圾回收线程。
此处介绍了设置。
有关解释/更多详细信息,请参阅此线程。
不要期望更改后 100% 的 CPU 负载,但您将接近 100% 并增加它的 spead。

并发可视化工具将在此处为您提供帮助。您将看到每个线程何时执行,如果所有线程都没有执行,您可以确切地看到特定线程正在等待的原因。如果生成大量垃圾,GC 可能会阻塞线程,从而导致线性缩放不足。但你只有通过真正的调查才能发现。

我在使用 .NET Framework v2.0 时遇到了同样的问题,然后我将项目目标框架更改为 v4.0,它以 100% CPU 负载开始

编辑:您可以观察每个线程的CPU使用率,只需使用

Sysinternals Process Explorer

进程黑客