15

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

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

有任何想法吗?

更多信息:

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

3 回答 3

3

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


于 2012-04-24T08:04:55.607 回答
1

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

于 2012-04-24T08:15:50.207 回答
1

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

编辑:您可以查看每个线程的 CPU 使用情况,只需使用

Sysinternals 进程浏览器

或者

进程黑客

于 2012-04-24T10:46:15.530 回答