繁体   English   中英

C#中的多线程CPU使用率

[英]multi-thread CPU usage in C#

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

就像我之前提到的那样,线程是完全独立的(没有锁和没有争论)当我用1个线程运行程序4次时,我获得了100%的CPU使用率(即,当每个进程的4个进程为1个线程时,我得到了正确的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性能监视器来寻找没有的争用。

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

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

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

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

Sysinternals Process Explorer

要么

流程黑客

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM