SQL Server 2005 - 多处理器使用

时间:2009-10-02 16:05:32

标签: sql sql-server sql-server-2005 performance

我们有一个16处理器的SQL Server 2005群集。在查看CPU使用率数据时,我们发现大多数时候只使用了16个处理器中的4个。然而,在高负载期间,偶尔会使用第5和第6个处理器,尽管从未接近使用其他4个处理器。我担心在极高负载期间并非所有其他处理器都将被利用我们的性能会下降。

我们看到的是标准的SQL Server 2005群集行为吗?我假设所有16个处理器都会在任何时候都被使用,尽管事实并非如此。这是我们可以调整的吗?或者这是预期的行为?如果涉及到SQL服务器是否能够利用所有16​​个处理器?

4 个答案:

答案 0 :(得分:3)

我会认为你做了尽职调查并验证了CPU消耗属于sqlservr.exe进程,因此我们不会在这里追逐红鲱鱼。如果没有,请通过检查Process \%Processor性能计数器确保sqlservr.exe使用CPU。

您需要了解SQL Server CPU调度模型,如Thread and Task Architecture中所述。 SQL Server通过将每个请求分配给由工作者(sys.dm_exec_requests)运行的任务(sys.dm_os_schedulers),跨请求程序(sys.dm_os_tasks)传播请求(sys.dm_os_workers)。工作线程由OS线程或光纤(sys.dm_os_threads)支持。大多数请求(发送到SQL Server的批处理)只产生一个任务,但有些请求可能会产生多个任务(并行查询是最臭名昭着的)。

SQL Server 2005调度的正常行为应该是在所有调度程序中均匀分配任务。每个调度程序对应一个CPU核心。结果应该是所有CPU内核的均匀负载。但是我已经在实验室中看到了几次你描述的问题,当物理工作负载只在几个CPU上分布不均匀时。您必须了解SQL Server 控制其工作线程的线程关联性,而是依赖于操作系统关联性算法来获取线程局部性。这意味着即使SQL Server在16个调度程序中传播请求,操作系统也可能决定仅在4个核心上运行线程。与此问题相关的是,有两个问题可能导致或加剧此行为:

  • 超线程。如果您启用了超线程,请将其关闭。 SQL Server和超线程should never mix
  • 坏司机。确保安装了正确的系统设备驱动程序(适用于主板等)。

还要确保您的SQL 2005至少处于SP2级别,最好在最新SP和所有CU应用。 Windows也是如此(运行Windows 2003或Windows 2008吗?)。

理论上,这种行为也可以通过一种非常特殊的工作量来解释,即。 SQL只看到很少很长且CPU要求很高的请求,没有parallle选项。但这将是一个极端倾斜的负载,我在现实生活中从未见过这样的东西。

答案 1 :(得分:2)

即使考虑到IO瓶颈,我也会检查你是否设置了处理器亲和力,你的maxdop设置是什么,无论是SMP还是NUMA,这也应该影响你可能希望设置的maxdop。

当你说你有16个处理器集群时,你的意思是集群中有2个SQL服务器,每个服务器有16个处理器,或2 x 8路SQL服务器?

答案 2 :(得分:1)

你确定你在其他地方没有瓶颈吗?在IO上也许?

答案 3 :(得分:1)

很难确定没有硬数据,但我怀疑问题是你现在比CPU绑定更多的IO绑定或内存限制,并且4个处理器足以跟上你真正的瓶颈。

我的理由是,如果有一些配置问题限制为4 cpus,你根本不会看到它溢出到第5和第6个处理器。