六、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) 2013-08-05 21:05:08.74 Server (c) Microsoft Corporation. |
请注意最后一行记录,显示目前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时需要注意这个问题。
相关文章