我一直在使用Parallel.ForEach来获取&同时处理数据。 Parallel.ForEach中使用的集合有100多个元素。如果我不限制并行创建的线程数,则从连接池中创建SqlConnection,抛出超出连接池限制的异常。
现在我想设置maxdegreeofparallelism以限制随时创建的连接。生产服务器可能具有超线程支持。如果系统支持超线程,那么建议将No LOGIC核心而不是PHYSICAL核心设置为maxdegreeofparallelism。
那么,我应该使用#LOGICAL核心还是物理核心的设置?
答案 0 :(得分:2)
这真的应该被关闭,因为它不清楚,显然还有另一个问题,而不是你要问的问题。
您应该使用您需要的号码。系统内部已经使用了限制。如果他们不适合您,则您必须定义限制。它与系统中的物理或虚拟核心数无关。
通常不建议从单个数据库并行获取数据,因为它实际上可能会使整个过程变慢。
由于连接池运行连接存在问题,因此有两种选择:
我建议回到设计并思考,而不是尝试更改设置,实际上最好只是暂时隐藏问题,最坏情况下浪费时间而不是帮助。
答案 1 :(得分:-1)
如果系统支持超线程,那么建议将No LOGIC核心而不是PHYSICAL核心设置为maxdegreeofparallelism
IMO它应该等于逻辑核心的数量或者大于它。
原因是超线程处理器试图彼此独立地执行两个线程。以下是Nehalem processor architecture paper
的引用Nehalem(和其他现代处理器)采用的基本方法 最大化指令完成率是允许微观操作的 许多指令尽可能与微操作并行进行 在每个时钟周期占用独立的FU [功能单元]。
如果查看任务管理器,OS会将每个逻辑核心显示为独立处理器。当然,逻辑核心是否真正独立存在技术问题。但是,在这个级别你应该把它们视为IMO的独立单位。
另一个想法是你可以考虑将线程数增加到可用连接数,特别是如果你有任何等待/阻塞。当线程处于等待状态时,例如在等待IO操作完成时,它不会被安排执行。这是您需要使用代码和数据库进行测试的内容。