六、CPU优化(3)处理器组

一、SQL Server 启动参数

  SQL Server 有3个默认的启动参数,分别标识3个启动文件的位置。

(1)“-d”参数。标识master.mdf文件的位置。一般为C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\master.mdf 。

(2)“-l”参数。标识master数据库的LDF文件的位置。一般为C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\mastlog.ldf 。

(3)“-e”参数。标识启动日志的文件名和存储位置。一般为C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Log\ERRORLOG 。

 

  针对不同版本的数据库产品,有2种不同的方法查看启动参数。

1. SQL Server 2012以前的版本

  打开SQL Server配置管理器,编辑某个实例的属性。在“高级”选项卡,在“启动参数”编辑框进行查看或编辑。

 

2. SQL Server 2012

  SQL Server 2012 新增了一个独立的“启动参数”选项卡,专门用于查看和修改启动参数。

 

 

二、启动文件示例

  SQL Server 每次启动时,都先将原来的ERRORLOG.n(n=1,2,3等)改名为ERRORLOG.(n+1),然后将ERRORLOG 文件改名为ERRORLOG.1,最后生成一个新的ERRORLOG 文件。

  先看一下ERRORLOG 文件的前面一部分内容。

2013-08-05 21:05:08.70 Server      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
 Apr  2 2010 15:48:46 
 Copyright (c) Microsoft Corporation
 Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

2013-08-05 21:05:08.74 Server      (c) Microsoft Corporation.
2013-08-05 21:05:08.74 Server      All rights reserved.
2013-08-05 21:05:08.74 Server      Server process ID is 2560.
2013-08-05 21:05:08.74 Server      System Manufacturer: 'Dell Inc.', System Model: 'PowerEdge R510'.
2013-08-05 21:05:08.74 Server      Authentication mode is MIXED.
2013-08-05 21:05:08.75 Server      Logging SQL Server messages in file 'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\ERRORLOG'.
2013-08-05 21:05:08.76 Server      This instance of SQL Server last reported using a process ID of 2572 at 8/5/2013 9:02:22 PM (local) 8/5/2013 1:02:22 PM (UTC). This is an informational message only; no user action is required.
2013-08-05 21:05:08.76 Server      Registry startup parameters: 
  -d D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\master.mdf
  -e D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\ERRORLOG
  -l D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\mastlog.ldf
2013-08-05 21:05:08.82 Server      SQL Server is starting at normal priority base (=7). This is an informational message only. No user action is required.
2013-08-05 21:05:08.83 Server      Detected 24 CPUs. This is an informational message; no user action is required.

 

  请注意最后一行记录,显示目前SQL Server检测到了总共24个逻辑CPU。

 

三、处理器组

1. 逻辑CPU 

  在购买SQL Server 2008 正版时,标准版和企业版都有一种Per Processor 授权方式,这里的Processor 只是针对物理CPU,与核(core)的数量没有关系。

  从SQL Server 2012开始,不再计算物理CPU的数量,改为按core的数量购买license。但是core的数量并不等同于逻辑CPU 的数量,因为在前一篇文章中还提到超线程。如果启用了超线程,那么逻辑CPU 的数量就是变成了2倍。

  通过以下方式查看处理器的数量:

(1)Windows的系统信息

  在命令提示符下面运行: systeminfo

 

(2)任务管理器

  在任务管理器可以看到有多少个框,代表多少个逻辑CPU。

 

(3)SSMS

  在SSMS中可以查看当前使用了多少个逻辑CPU。

 

(4)DMV

  一个处理器内核可能包含一个或多个逻辑处理器。 以下 Transact-SQL 查询可用于获取系统的 CPU 信息。

SELECT (cpu_count / hyperthread_ratio) AS PhysicalCPUs, 
cpu_count AS logicalCPUs 
FROM sys.dm_os_sys_info 

 

2. 处理器组

  以本人2012年在深圳处理某客户的真实案例来说,有4个物理CPU,每个CPU 有10核,并且启用了超线程,因此逻辑CPU 的数量为 4*10*2=80 。但是,每次SQL Server 启动后在SSMS 查看逻辑CPU 的数量,发现这个数字不确定,例如,有时候是40个逻辑CPU,有时候竟然是20。这是为什么呢?那么需要我们了解一下Windows 是如何识别大数量的逻辑CPU。

  在Windows ver6.0(Windows Vista、Windows Server 2008)操作系统中,不支持超过64个逻辑CPU。之后,随着物理CPU 、核的数量也增加,导致出现了超过64个逻辑CPU 的情形。Windows ver6.1(Windows 7、Windows Server 2008 R2)操作系统为了解除这个限制,引入了处理器组(Processor Group)的概念。这个功能仅适用于64位操作系统,在32位操作系统里无效。http://msdn.microsoft.com/en-us/library/dd405503(v=vs.85).aspx

  Windows ver6.1在启动时,会根据逻辑CPU之间的物理远近,自动编组。每一个组内的逻辑CPU不能超过64个,超过的部分再编入另一个组。目前的CPU是纳米精度的集成芯片,操作系统在判断逻辑CPU之间的物理远近时难免会发生“误判”。这样导致每次启动Windows时,都可能会得到不一样的分组情况,可能是60+20分配,也可能是40+40分配。

  SQL Server 2008在启动时,Windows以轮询的方式给它分配处理器组,然后SQL Server引擎就一直在这个处理器组里运行,直到重启SQL Server才重新分配处理器组。处理器组的不确定性,使SQL Server能够检测到的逻辑CPU数量也存在不确定性。

  在本例中,建议客户禁用了超线程之后,逻辑CPU的总数量降到40个,都编进一个处理器组了,因此就不存在问题了。

 

 

四. 修复 

1. Windows修复

  Windows ver6.1 目前不能将超过64个逻辑CPU编进一个处理器组。官方只是提供了一个补丁,避免60+20这种极端的分配情况(在此极端情况下,可能会将只有20个逻辑CPU的处理器组分派给SQL Server)。《Performance issues when more than 64 logical processors are used in Windows Server 2008 R2》 http://support.microsoft.com/kb/2510206/zh-cn

 

2. SQL Server 修复

  在Windows ver6.1之后发布的 SQL Server 2008 R2 解决了这个问题,但SQL Server 2008 R2 最多只能检测到256个逻辑CPU。

 

3. NUMA

  对于NUMA架构,可以适当地手动调整。《How to manually configure K-Group assignment on multiprocessor machines》 http://support.microsoft.com/kb/2506384/zh-cn

 

 

本文结语:

  SQL Server 2008 for Windows Server 2008 在遇到超过64个逻辑CPU时需要注意这个问题。

 

本文出自 “我们一起追过的MSSQL” 博客,转载请与作者联系!

你可能感兴趣的:(PTO)