Parallel.Foreach 考虑支持超线程的逻辑内核或物理内核?

Parallel.Foreach considers logical cores or physical cores where hyperthreading supported?

我一直在使用 Parallel.ForEach 来同时获取和处理数据。 Parallel.ForEach 中使用的集合有超过 100 个元素。如果我不限制并行创建的线程数,那么从连接池创建 SqlConnection 会抛出超出连接池限制的异常。

现在我想设置 maxdegreeofparallelism 以限制在任何 moment.Production 服务器上创建的连接可能具有超线程支持。如果系统支持超线程,那么是否建议将逻辑核心数而不是物理核心数设置为最大并行度。

那么,我应该使用 # LOGICAL cores 还是 PHYSICAL cores 的设置?

这真的应该关闭,因为它不清楚,而且显然还有另一个问题,而不是你问的问题。

您应该使用您需要的号码。系统内部已经有使用限制。如果他们不适合你,那么必须定义限制。它与系统中物理或虚拟内核的数量无关。

通常不建议从单个数据库并行获取数据,因为它实际上可能会使整个过程变慢。

并且由于您遇到连接池耗尽连接的问题,因此有两种选择:

  1. 将最大并行度设置为您在某一时刻实际可以获得的连接数
  2. 您没有正确关闭连接,您设置的任何数字仍然会导致问题

我建议回到设计并思考,而不是尝试更改实际上最多只能暂时隐藏问题的设置,最坏的情况是浪费时间并且根本没有帮助。

If hyperthreading is supported by system then is it advisable to set No of LOGICAL cores instead of PHYSICAL cores into maxdegreeofparallelism

IMO 它应该等于或大于逻辑核心数。

原因是超线程处理器试图独立执行两个线程。这是来自 Nehalem processor architecture paper

的引述

The fundamental approach Nehalem (and other modern processors) take to maximize instruction completion rates is to allow the micro-ops of as many instructions as feasible, proceed in parallel with micro-op occupying independent FUs [Functional Unit] at each clock cycle.

如果您查看任务管理器,OS 会将每个逻辑核心显示为一个独立的处理器。当然,关于逻辑核心是否真正独立存在技术细节。但是,在这个级别,您应该将它们视为独立的单位 IMO。

另一个想法是,您可以考虑将线程数增加到可用连接数,特别是如果您有任何 waiting/blocking 内部。当线程处于等待状态时,例如等待IO操作完成时,它不会被调度执行。这是您需要使用代码和数据库进行测试的内容。