【问题标题】:Multithreaded application does not reach 100% of processor usage多线程应用程序未达到 100% 的处理器使用率
【发布时间】:2012-04-14 02:22:15
【问题描述】:

我的多线程应用程序从 HD 中获取一些文件,然后处理这些文件中的数据。我重用了一个类的同一个实例(dataProcessing))来创建线程(我只是改变了调用方法的参数)。

processingThread[i] = new Thread(new ThreadStart(dataProcessing.parseAll));

我想知道原因是否可能是所有线程都从同一内存读取。

处理每个文件大约需要半分钟。由于文件只有 200 KB,因此可以快速读取。处理完文件后,我将所有结果写入一个目标文件。我认为问题不在于读取或写入磁盘。所有线程都在处理任务,但由于某种原因,处理器没有被充分利用。我尝试添加更多线程以查看是否可以达到 100% 的处理器使用率,但它会减慢并减少处理使用率,而不是完全使用它。任何人都知道可能出了什么问题?

【问题讨论】:

  • 这个过程怎么让你觉得瓶颈是CPU?
  • 好吧,当我调试应用程序时,我看到所有线程“都在做某事”。事实上,我使用更多线程可以获得一些时间,但如果我添加太多,性能会下降。
  • 我认为需要更多信息。所有这些任务都写回同一个文件,因此这可能是瓶颈。 30 秒来处理 200KB 的数据表明除了 CPU 绑定进程之外的其他东西......
  • 不,先生,我正在对信息运行一个复杂的算法。即使我什么都不写,也达不到处理器使用率的 100%。
  • 您只能同时运行与核心数量一样多的线程,因此在某些时候额外的线程会争夺时间,从而降低性能。

标签: c# multithreading performance parallel-processing


【解决方案1】:

您可能需要考虑以下几点:

  1. 当今的大多数 CPU 都是超线程的。即使操作系统假设每个超线程内核都有 2 条管道,但情况并非如此,并且非常依赖于 CPU 和您正在执行的算术运算。虽然在大多数 CPU 上,每条管道上有 2 个整数单元,但只有一个 FP,因此大多数 FP 操作并没有从超线程架构中获得任何好处。

  2. 由于文件只有 200k,我只能假设它已全部复制到缓存中,因此这不是内存/磁盘问题。

  3. 您是否使用外部 DLL?某些操作(例如使用本机 Bitmap 类读取/保存 JPEG 文件)不是并行的,如果您同时执行多个执行,您将看不到任何加速。

  4. 当您达到在线程之间切换的成本高于它们正在执行的操作的程度时,性能会降低。

  5. 您是只读取数据还是同时修改数据?如果每个线程也修改数据,那么缓存上有很多锁。最好让每个线程在自己的内存中收集自己的数据,并在所有线程都完成工作后将所有数据组合在一起。

【讨论】:

  • 我正在执行的运算不是算术运算。我确定不是磁盘瓶颈,因为我只需打开、读取和关闭文件所需的时间更少。是的,我使用的是外部 DLL,但我有多个 HtmlAgilityPack HtmlDocument 实例,每个线程一个。但是,它们都共享一个数据结构(仅用于读取)。
  • 我忘记在上一条消息中标记你了,有什么想法吗?
  • 是否存在线程使用锁定的点,例如在读取共享数据结构时?
  • @Devela - 我会将我的 2c 添加到 Gilad 的答案中 - 我认为线程之间存在一些锁定,或者正在处理文件的同一个线程也在读/写它们(a读/写操作是 IO 操作,这段时间使用的 CPU 很少,导致任务管理器下显示 CPU 利用率较低)。如果您先将所有文件读入内存,然后处理文件,最后写入磁盘会怎样。那么在处理阶段您是否看到 100% 的 CPU 使用率?
  • 已经这样做了,似乎是 XPath 问题,不容易并行化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多