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

本文关键字:内核 支持 Foreach 超线程 | 更新日期: 2023-09-27 17:53:16

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

现在我想设置maxdegreeofparallelism来限制在任何时刻创建的连接。生产服务器可能有超线程支持,如果系统支持超线程,那么建议将No of LOGICAL cores而不是PHYSICAL cores设置为maxdegreeofparallelism。

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

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

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

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

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

并且由于您有连接池耗尽连接的问题,有两个选项:

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

我建议回到设计和思考,而不是试图改变设置,实际上在最好的情况下只是隐藏问题,在最坏的情况下,浪费时间,根本没有帮助。

如果系统支持超线程,那么在maxdegreeofparallelism中设置No of LOGICAL cores而不是PHYSICAL cores是否可取

在我看来,它应该等于或大于逻辑核数。

原因是超线程处理器试图独立地执行两个线程。这是Nehalem处理器架构论文中的一段话

Nehalem(和其他现代处理器)采取的基本方法最大限度地提高指令完成率是为了允许as的微操作尽可能多的指令,与微操作并行进行在每个时钟周期占用独立的FUs[功能单元]。

如果你在任务管理器中查看操作系统将每个逻辑核心呈现为一个独立的处理器。当然,对于逻辑核心是否真正独立存在一些技术上的问题。然而,在这个层次上,你应该把它们看作是独立的单位。

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