首页 > 代码库 > 不均匀的Windows处理器编组
不均匀的Windows处理器编组
不均匀的Windows处理器编组
之前写过一篇文章,关于SQLSERVER能识别多少个逻辑CPU的,前些天在论坛里有人问Windows处理器编组是如何划分的??
SQLSERVER到底能识别多少个逻辑CPU?
在帖子给出了两篇文章,我们现在来看一下
http://social.technet.microsoft.com/Forums/zh-CN/17f34500-08d5-4302-a484-3ce487899a83/windows-2008-r2sql-server-2005cpu?forum=sqlserverzhchs
Uneven Windows Processor Groups
SQL Server 2005 and 2008 versions may not detect all available processors on a machine with more than 64 logical processors
Uneven Windows Processor Groups(不均匀的处理器编组)
这篇文章主要讨论64个逻辑cpu的硬件。
我们讨论Windows 2008R2 他支持64个逻辑处理器。当前可用的硬件是8个核的物理处理器/socket接口。
尽管加上超线程,那么意味着是16个逻辑cpu。每一个socket接口形成一个或两个NUMA节点。4个或8个逻辑cpu形成一个处理器编组。
处理器编组的分配是在操作系统启动的时候分配好的。因为这个原因,Windows2008R2 和之后的Windows操作系统会检查物理硬件架构为了
分配跟NUMA节点相对应的处理器编组,并且检查内存延时,为了决定分配哪一个逻辑cpu到哪一个处理器编组。一旦分配完成,就不能再动态更改!
这样的分配工作只会发生在超过64个逻辑cpu的硬件架构。在典型的8-socket服务器,资源和内存的分布通常是不均匀的,在不同的处理器编组之间
(除了一些在2009年和2010年的时候一些市场上出现的96个逻辑cpu的奇怪的硬件)
已经开发好的软件面对处理器编组这个概念会发生什么?在大于64个逻辑cpu的时候,软件会怎样选择不同的逻辑处理器
实际上,Windows会在应用程序启动的时候分配其中一个处理器编组给它。应用程序会检查64逻辑cpu窗口是否在运行。
然而应用程序会检查完整的内存资源。典型的应用程序会被调度到其中一个处理器编组。
只要处理器编组有均匀的分布和软件不需要依赖某些NUMA节点的可用性,一切都很好。
然而,这个平衡受到英特尔发布的最新版本的Intel Xeon E7处理器核心家族的( 10和20逻辑处理器)的影响
显然,核心的数量和逻辑处理器的数量加起来不太好对于64核cpus。在我的博客里,我已经列出了我讨论的
处理器影响到SQLSERVER服务器关联掩码的设置。
到目前位置我们并没有讨论到Windows2008R2是如何分配4-socket服务器上的80个逻辑处理器或一个8-socket服务器上的160个逻辑处理器的情况。
Windows2008R2的原来算法实现就是创建尽可能少的处理器编组并且保持每个处理器编组里的处理器数量尽可能足够大。
因此我们使用这些新的10-core处理器最终会造成处理器编组的不均匀,让我们看看发生了什么事。
检测当前的处理器编组信息
为了检测Windows2008R2上面的确切的处理器编组的信息,硬件通常需要编出超过64个逻辑CPU的线程。执行检查的工具的名字叫“coreinfo ”
下载地址:http://technet.microsoft.com/en-us/sysinternals/cc835722.aspx
下载地址:http://files.cnblogs.com/lyhabc/Coreinfo.zip
请下载coreinfo .exe然后在cmd窗口里运行它。
最好使用下面语句将coreinfo的信息输出到文本文件以便分析
coreinfo > structure.txt
structure.txt文件内容
Intel(R) Pentium(R) CPU G630 @ 2.70GHz Intel64 Family 6 Model 42 Stepping 7, GenuineIntel HTT * Hyperthreading enabled HYPERVISOR - Hypervisor is present VMX * Supports Intel hardware-assisted virtualization SVM - Supports AMD hardware-assisted virtualization EM64T * Supports 64-bit mode SMX - Supports Intel trusted execution SKINIT - Supports AMD SKINIT NX * Supports no-execute page protection SMEP - Supports Supervisor Mode Execution Prevention SMAP - Supports Supervisor Mode Access Prevention PAGE1GB - Supports 1 GB large pages PAE * Supports > 32-bit physical addresses PAT * Supports Page Attribute Table PSE * Supports 4 MB pages PSE36 * Supports > 32-bit address 4 MB pages PGE * Supports global bit in page tables SS * Supports bus snooping for cache operations VME * Supports Virtual-8086 mode RDWRFSGSBASE - Supports direct GS/FS base access FPU * Implements i387 floating point instructions MMX * Supports MMX instruction set MMXEXT - Implements AMD MMX extensions 3DNOW - Supports 3DNow! instructions 3DNOWEXT - Supports 3DNow! extension instructions SSE * Supports Streaming SIMD Extensions SSE2 * Supports Streaming SIMD Extensions 2 SSE3 * Supports Streaming SIMD Extensions 3 SSSE3 * Supports Supplemental SIMD Extensions 3 SSE4a - Supports Sreaming SIMDR Extensions 4a SSE4.1 * Supports Streaming SIMD Extensions 4.1 SSE4.2 * Supports Streaming SIMD Extensions 4.2 AES - Supports AES extensions AVX - Supports AVX intruction extensions FMA - Supports FMA extensions using YMM state MSR * Implements RDMSR/WRMSR instructions MTRR * Supports Memory Type Range Registers XSAVE * Supports XSAVE/XRSTOR instructions OSXSAVE * Supports XSETBV/XGETBV instructions RDRAND - Supports RDRAND instruction RDSEED - Supports RDSEED instruction CMOV * Supports CMOVcc instruction CLFSH * Supports CLFLUSH instruction CX8 * Supports compare and exchange 8-byte instructions CX16 * Supports CMPXCHG16B instruction BMI1 - Supports bit manipulation extensions 1 BMI2 - Supports bit manipulation extensions 2 ADX - Supports ADCX/ADOX instructions DCA - Supports prefetch from memory-mapped device F16C - Supports half-precision instruction FXSR * Supports FXSAVE/FXSTOR instructions FFXSR - Supports optimized FXSAVE/FSRSTOR instruction MONITOR * Supports MONITOR and MWAIT instructions MOVBE - Supports MOVBE instruction ERMSB - Supports Enhanced REP MOVSB/STOSB PCLULDQ * Supports PCLMULDQ instruction POPCNT * Supports POPCNT instruction LZCNT - Supports LZCNT instruction SEP * Supports fast system call instructions LAHF-SAHF * Supports LAHF/SAHF instructions in 64-bit mode HLE - Supports Hardware Lock Elision instructions RTM - Supports Restricted Transactional Memory instructions DE * Supports I/O breakpoints including CR4.DE DTES64 * Can write history of 64-bit branch addresses DS * Implements memory-resident debug buffer DS-CPL * Supports Debug Store feature with CPL PCID * Supports PCIDs and settable CR4.PCIDE INVPCID - Supports INVPCID instruction PDCM * Supports Performance Capabilities MSR RDTSCP * Supports RDTSCP instruction TSC * Supports RDTSC instruction TSC-DEADLINE * Local APIC supports one-shot deadline timer TSC-INVARIANT * TSC runs at constant rate xTPR * Supports disabling task priority messages EIST * Supports Enhanced Intel Speedstep ACPI * Implements MSR for power management TM * Implements thermal monitor circuitry TM2 * Implements Thermal Monitor 2 control APIC * Implements software-accessible local APIC x2APIC - Supports x2APIC CNXT-ID - L1 data cache mode adaptive or BIOS MCE * Supports Machine Check, INT18 and CR4.MCE MCA * Implements Machine Check Architecture PBE * Supports use of FERR#/PBE# pin PSN - Implements 96-bit processor serial number PREFETCHW * Supports PREFETCHW instruction Maximum implemented CPUID leaves: 0000000D (Basic), 80000008 (Extended). Logical to Physical Processor Map: *- Physical Processor 0 -* Physical Processor 1 Logical Processor to Socket Map: ** Socket 0 Logical Processor to NUMA Node Map: ** NUMA Node 0 Logical Processor to Cache Map: *- Data Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 *- Instruction Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 *- Unified Cache 0, Level 2, 256 KB, Assoc 8, LineSize 64 -* Data Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64 -* Instruction Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64 -* Unified Cache 1, Level 2, 256 KB, Assoc 8, LineSize 64 ** Unified Cache 2, Level 3, 3 MB, Assoc 12, LineSize 64 Logical Processor to Group Map: ** Group 0
打开文件,你会看到类似于下面的section ,通常结果是在最后一个section 。这个section 叫 ‘Logical Processor to Group Map’.
有80 逻辑cpu的机器的结果通常是这样:
The result of a server with 80 LOGICAL PROCESSOR threads might look like:
Group 0: ************************************************************ -------------------- Group 1: ------------------------------------------------------------ ********************
这个‘*’星字符符号的数量代表当前处理器编组中有多少个逻辑cpu。
符号“-”代表着一个逻辑处理器线程不是处理器组的一部分。
因此,上面的内容告诉我们处理器编组0里有60个逻辑cpu,而处理器编组1只有20个逻辑cpu。
160个逻辑cpu的硬件的结果会是这样
Logical Processor to Group Map: Group 0: ************************************************************ ------------------------------------------------------------ ---------------------------------------- Group 1: ------------------------------------------------------------ ************************************************************ ---------------------------------------- Group 2: ------------------------------------------------------------ ------------------------------------------------------------ ****************************************
可以看到三个处理器编组中,有两个处理器编组有60个逻辑cpu,而第三个处理器编组只有40个逻辑cpu
我的台式机,双核AMDcpu,处理器编组只有一个,处理器编组中只有2个逻辑cpu
Logical Processor to Group Map: ** Group 0
不均匀的处理器编组带来的问题
遇到处理器编组不均匀的情况,应用程序有可能会分到第一个处理器编组,也有可能被分到第二个处理器编组。
重启应用程序有可能会被分配到跟刚才的处理器编组不一样的处理器编组,有可能会被分到逻辑cpu比较多的处理器编组也有可能是比较少逻辑cpu的
那个处理器编组。分到不同的处理器编组会导致应用程序在不同的负载下有不同的行为。
对于SAP软件和SQLSERVER为了获得可预计的性能,我们建议配置Windows2008R2创建处理器编组的时候都有相同数量的逻辑cpu。
为了配置,Windows开发人员改变了处理器编组的算法在QFE 里面。
获得分配均匀的处理器编组
最容易获得均匀分配的处理器编组的方法是获取微软在2011年三月份发布的QFE
QFE 的信息和微软相关知识库文章可以在这里找到:http://support.microsoft.com/kb/2510206
当构建处理器编组的时候QFE 会改变策略。目的是构建相同size的处理器编组。例如:在由英特尔Xeon E7 家族(10核心超线程)4核或8核的处理器硬件里
我们能够检测到在40个逻辑处理器里,处理器编组可能会有2个或4个。如果是两个,那么每个处理器编组会有20个逻辑处理器,如果是四个,那么每个处理器编组
会有10个逻辑处理器。
在下一代Windows(可能是Windows2012)里会默认使用这个新的策略
更多信息请参考:OSS note #1635387 – Windows Processor Groups
SQLSERVER2005和SQLSERVER2008有可能不会检测到可用的处理器在一个超过64个逻辑cpu的机器上
SQL Server 2005 and 2008 versions may not detect all available processors on a machine with more than 64 logical processors
http://blogs.msdn.com/b/pamitt/archive/2011/11/02/sql-server-2005-and-2008-versions-may-not-detect-all-available-processors-on-a-machine-with-more-than-64-logical-processors.aspx
场景:我最近遇到一个场景SQL2005实例安装在Windows2008R2上面,在开启了超线程之后不能检测到所有可用的逻辑处理器。
机器有4socket接口,每个socket接口有一个NUMA节点,每个socket有10个核心,所以一共有40核心。没有开启超线程,SQLSERVER能检测到40个逻辑cpu
然而,开启了超线程之后,只能检测到20个逻辑cpu,尽管一共有80个逻辑cpu可用。
下面是在开启和关闭超线程的时候,SQLSERVER的错误日志
With Hyperthreading turned OFF 2011-10-27 12:37:32.74 Server Detected 40 CPUs. This is an informational message; no user action is required. 2011-10-27 12:37:32.94 Server Large Page Extensions enabled. 2011-10-27 12:37:32.94 Server Large Page Granularity: 2097152 2011-10-27 12:37:32.98 Server Large Page Allocated: 32MB 2011-10-27 12:37:33.03 Server Large Page Allocated: 32MB 2011-10-27 12:37:33.42 Server Using locked pages for buffer pool. 2011-10-27 12:37:33.79 Server Large Page Allocated: 32MB 2011-10-27 12:37:33.90 Server Large Page Allocated: 32MB 2011-10-27 12:37:34.17 Server Using dynamic lock allocation. Initial allocation of 2500 Lock blocks and 5000 Lock Owner blocks per node. This is an informational message only. No user action is required. 2011-10-27 12:37:34.19 Server Lock partitioning is enabled. This is an informational message only. No user action is required. 2011-10-27 12:37:34.53 Server Multinode configuration: node 0: CPU mask: 0x00000000000ffc00 Active CPU mask: 0x00000000000ffc00. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required. 2011-10-27 12:37:34.60 Server Multinode configuration: node 1: CPU mask: 0x00000000000003ff Active CPU mask: 0x00000000000003ff. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required. 2011-10-27 12:37:34.65 Server Multinode configuration: node 2: CPU mask: 0x000000003ff00000 Active CPU mask: 0x000000003ff00000. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required. 2011-10-27 12:37:34.70 Server Multinode configuration: node 3: CPU mask: 0x000000ffc0000000 Active CPU mask: 0x000000ffc0000000. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required With Hyperthreading turned ON 2011-10-27 13:13:50.31 Server Detected 20 CPUs. This is an informational message; no user action is required. 2011-10-27 13:13:50.48 Server Large Page Extensions enabled. 2011-10-27 13:13:50.48 Server Large Page Granularity: 2097152 2011-10-27 13:14:04.68 Server Large Page Allocated: 32MB 2011-10-27 13:14:07.87 Server Using locked pages for buffer pool. 2011-10-27 13:14:12.25 Server Using dynamic lock allocation. Initial allocation of 2500 Lock blocks and 5000 Lock Owner blocks per node. This is an informational message only. No user action is required. 2011-10-27 13:14:12.28 Server Lock partitioning is enabled. This is an informational message only. No user action is required.
原因和解释:一个新的概念在Windows2008R2里叫做:“处理器编组”。
SQLSERVER2008,SQLSERVER2005因为这个处理器编组会引发一些问题。
什么是处理器编组:在Windows2008R2里面是支持超过64个逻辑cpu的根据处理器编组的概念,处理器编组是一组64逻辑cpu,处理器编组是一个静态的编组
他将64个逻辑处理器视为同一个单独的调度实体。处理器编组是从0开始的,如果系统的逻辑cpu个数小于64个,那么就只有一个处理器编组: Group 0。
操作系统会最小化处理器编组的数量。例如:在一个有128个逻辑处理器的cpu里会有两个处理器编组,每个处理器编组会有64个逻辑处理器,而不是
每个处理器编组32个逻辑处理器。处理器编组是一个新概念在Windows2008R2里面,它不支持Windows2008,Windows vista和Windows2003
为什么处理器编组影响了SQLSERVER2005和SQLSERVER2008实例了?跟着下面的3个因素你就会知道怎样影响到SQLSERVER
SQL2005和SQL2008是先于Windows2008R2发布的,因此这些版本的SQLSERVER不会利用到Windows2008R2的新的API,
去获得处理器编组的优势。
在一个大于64个逻辑处理器的系统上,Windows2008R2会构建不均匀的处理器编组,这是因为在Windows2008R2最初的算法实现上,
会创建尽可能小的处理器编组并且保持独立的处理器编组足够大。如果机器只有<=64个逻辑cpu,那没有什么问题,这时候只会有一个处理器编组.
然而,如果机器有超过64个逻辑cpu,Windows2008R2会创建超过一个的处理器编组,SQLSERVER2005/2008会束缚于某一个处理器编组,
当SQLSERVER重启的时候。在我们的场景,在开启超线程之后,机器会有80个逻辑cpu和4个NUMA节点,每一个处理器编组就有两个NUMA节点
在Windows2008R2操作系统里。
第一个处理器编组有3个NUMA节点,因此第一个处理器编组会有60逻辑处理器,而第二个处理器编组只有一个NUMA节点,二十个逻辑处理器。
当SQLSERVER实例重启的时候,SQLSERVER被束缚到第二个处理器编组,即20个逻辑处理器
Windows2008R2会随机分配应用程序到某一个处理器编组
变通方案和解决办法:
要想全部利用超过64个逻辑处理器,那么你必须将SQLSERVER升级到SQLSERVER2008R2
如何逼使SQLSERVER使用最大逻辑cpu数量的那个处理器编组?
例如:在一个有96cpus的机器上,你有两个处理器编组,编组1有64个逻辑cpus,编组2有32个逻辑cpus。如果你有SQLSERVER2005/2008
企业版,你可以使用sc.exe工具根据这篇文章去做:this blog article
如何解决非均匀的处理器编组,可以应用Windows2008R2 补丁 KB 2510206
如何手动指定使用哪一个NUMA节点,可以参考这篇知识库文章:SQL Server on Windows 7 / Windows 2008 R2 with more than 64 CPUs
更多的参考文章
Additional References:
- Processor Groups
- Uneven Windows Processor Groups
- Performance issues when more than 64 logical processors are used in Windows Server 2008 R2
- How to manually configure K-Group assignment on multiprocessor machines
- Changes in affinity settings of SQL Server 2008 R2 to support > 64 Logical Processors
- Windows 2008 R2 - Groups, Processors, Sockets, Cores Threads, NUMA nodes what is all this?
- ALTER SERVER CONFIGURATION
- SQL Server on Windows 7 / Windows 2008 R2 with more than 64 CPUs
- How many logical processors does SQL Server 2008 R2 Enterprise Edition support
总结
使用最新版的SQLSERVER,如果遇到CPU性能问题,你可以检查一下SQLSERVER当前利用的逻辑CPU数量
当然,你的机器配置需要超过64个逻辑处理器
如有不对的地方,欢迎大家拍砖o(∩_∩)o