问题描述:生产环境一个数据库从SQLSERVER 2008 R2升级到SQLSERVER 2012 ,同时更换硬件,但迁移后发现性能明显降低,应用写入、读取性能降低的比较厉害;算法
向微软寻求帮助后得出答案,原来这与SQLSERVER的安装介质有关。sql
大体意思是说因为NUMA架构能够自行管理内存池,在安装了CAL的EE后,因为限制只能使用20个cores,一样内存则只能管理到20个cores涉及到的NUMA的对应的内存空间(具体算法为 限制内存=当前物理内存/NUMA数量*(总核数/20)),若是限制SQL Server的最大使用内存超过前面说的限制内存,则当使用内存大于限制内存须要再向操做系统再申请空间时,则会产生跨NUMA处理的状况,致使大量消耗系统资源,引发性能降低;数据库
http://blogs.msdn.com/b/saponsqlserver/archive/2012/06/15/sql-server-2012-enterprise-editions.aspx架构
这是我在网上找到的解释,摘录其中几段(本人E文水平有限,翻译不当之处敬请见谅)app
关于SQLSERVER EE的安装介质(EE为Enterprise Editions简拼,企业版)socket
上面说到 即使是SQLSERVER EE,因为受权方式的差别致使对processor cores的限制ide
For customers with Software Assurance on existing SQL EE Server licensessqlserver
An Enterprise Edition which is licensed per core and which does not have limits on the # of cores usable on a server性能
经过如下方式能够检查当前运行的SQL EE信息ui
一、sp_readerrorlog ,第一行显示SQLSERVER 版本信息以下
2012-05-08 16:04:54.56 Server Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit)on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
二、select serverproperty('Edition') ,显示版本信息以下
Enterprise Edition (64-bit)
如何判断当前的SQL EE是基于per CAL仍是per core的呢?若是显示的信息如上所示,那就是基于per CAL的,文中再次强调此模式下受限于20 cores;
Answer is: It is the CAL licensed one and with that the Enterprise Edition which is limited to 20 cores!!!
而若是显示的信息以下所示,那就是基于per core的 则没有限制;
The per-core licensed Enterprise Edition will show like this:
2012-05-18 23:57:29.77 Server Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
Executing:
select serverproperty('Edition')
which then could show this result:
Enterprise Edition: Core-based Licensing (64-bit)
关于20 cores的限制问题,须要区分CPU是否支持超线程而言
Other indications that there might be a limitation to 20 cores could be identified as well at the beginning of the SQL Server 2012 errorlog where we can find a message like:
SQL Server detected 4 sockets with 6 cores per socket and 6 logical processors per socket, 24 total logical processors; using 20 logical processors based on SQL Server licensing.
In the case above, we are looking at a server with the last generation of Intel processors which did not have Hyperthreading yet. Or in more modern Intel Servers with Hyperthreading it would look like:
SQL Server detected 4 sockets with 8 cores per socket and 16 logical processors per socket, 64 total logical processors; using 40 logical processors based on SQL Server licensing.
上文中的描述,根据SQL Server 2012 errorlog中的内容,咱们能够看到
若是SQL Server 检测到 4个插槽,每一个插槽有6个核,且有6个逻辑处理器(单线程),则总共为24个逻辑处理器,受限于SQL Server licenseing,只能使用20个逻辑处理器;
对于超线程CPU:
若是SQL Server 检测到 4个插槽,每一个插槽有8个核,且有16个逻辑处理器(单线程),则总共为64个逻辑处理器,受限于SQL Server licenseing,只能使用40个逻辑处理器;
Another possibility of discovery is through the Microsoft MAP toolkit. Where to get it and how to use it is excellently described in this document: http://download.microsoft.com/download/F/F/2/FF29F6CC-9C5E-4E6D-85C6-F8078B014E9F/Determining_SQL_Server_2012_Core_Licensing_Requirements_at_SA_Renewal_Apr2012.pdf
另一种可能的发现是经过Microsoft MAP toolkit,能够在如下这个文档中获得更准确的描述;
---------------------------华丽丽的分割线---------------------------------------
The limitation or the cap is enforced by the # of SQL Server schedulers. Usually SQL Server creates one scheduler thread for every logical CPU on a server. Each of those scheduler threads is administrating a pool of worker threads which execute requests or are in different other states. A scheduler only can have one thread running at maximum. If a scheduler thread over all of the time has one of worker threads running, it can leverage at maximum one logical CPU and not a bit more. If there are (as in the second situation above) only 40 schedulers active to schedule worker threads, the maximum number of CPU power we can use at any given time is 40 logical CPUs.
Querying sys.dm_os_schedulers with this query:
select * from sys.dm_os_schedulers
we will realize that the all the schedulers are ‘Visible’ for all the logical CPUs, but only 40 of them will be ‘Online’, whereas the others are ‘Offline’
If you disable Hyperthreading, the number of schedulers being Online will decline to 20, since one single core is now represented by one CPU thread only compared to two with Hyperthreading enabled. In cases where there are many more CPU threads or logical CPUs than the limit of the Server+CAL licensed SQL Server 2012 Enterprise Edition, one certainly can use affinity mask settings to chose the CPUs SQL Server shall use.
经过sys.dm_os_schedulers这个DMV能够查询到SQL Server调度线程的状况;
如何在EE的两个不一样的产品间变动?在下面的连接中能够找到答案
http://msdn.microsoft.com/zh-cn/library/ms143393.aspx