不均匀的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:


总结

使用最新版的SQLSERVER,如果遇到CPU性能问题,你可以检查一下SQLSERVER当前利用的逻辑CPU数量

当然,你的机器配置需要超过64个逻辑处理器

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

不均匀的Windows处理器编组的更多相关文章

  1. SQLSERVER到底能识别多少个逻辑CPU?

    SQLSERVER到底能识别多少个逻辑CPU? SQLSERVER到底能识别多少个逻辑CPU? 前言 在前几天在论坛有人遇到SQLSERVER识别逻辑CPU的问题 帖子地址: http://socia ...

  2. sql server 2012不能全部用到CPU的逻辑核心数的问题

    最近在工作中遇到了,sql server 2012 不能把CPU 的核心全部用到的问题.通过分析工具看到 总共CPU核心有72核,但sql 只能用到40核心,想信也有很多人遇到这问题,那么今天这节就先 ...

  3. 译 .NET Core 3.0 发布

    原文:<Announcing .NET Core 3.0> 宣布.NET Core 3.0 发布 很高兴宣布.NET Core 3.0的发布.它包括许多改进,包括添加Windows窗体和W ...

  4. 基于正向扫描的并行区间连接平面扫描算法(IEEE论文)

    作者: Panagiotis Bouros ∗Department of Computer ScienceAarhus University, Denmarkpbour@cs.au.dkNikos M ...

  5. 使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache)

    不过必须XP SP3以上才行.所有API大全: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).a ...

  6. windows集群简单介绍

    windows集群简单介绍仔细看过以前网友发表的一些文章,总觉得对windows集群没有详细介绍,我也是借花献佛,引用了一些技术性文档.目前应用最为广泛的集群计算技术可以分为三大类:高可用性集群技术. ...

  7. [转]Windows 下 Nginx+IIS 使用

    本文转自:https://blog.csdn.net/chihen/article/details/52698594 Windows 下 Nginx+IIS 使用 一.Nginx简介 Nginx (& ...

  8. [py]你真的了解多核处理器吗? 了解多线程

    越来越多的人搞爬虫,设计到多线程爬取, 还有一些机器学习的一些模块也需要这玩意, 感觉自己不会逼格不高. 抽时间赶紧玩一玩这东西, 希望提高对软件的认知和归属感,不要太傻. cpu内部架构参考 你知道 ...

  9. Windows 2012R2远程桌面服务简介

    一.远程桌面服务概述 远程桌面服务加快并扩展了到任何设备的桌面和应用程序部署,在帮助保护关键知识产权的安全的同时提高了工作人员的工作效率,简化了法规遵从性. 远程桌面服务启用虚拟机基础结构 (VDI) ...

随机推荐

  1. jQuery实现抖动效果

    //抖动效果 //intShakes:抖动次数:intDistance:抖动左右距离:intDuration:持续时间 jQuery.fn.shake = function (intShakes, i ...

  2. 百度Ueditor

    最近用到了百度Ueditor,也来写一写百度Ueditor的使用教程: 一.从官网下载百度Ueditor,http://ueditor.baidu.com/website/download.html, ...

  3. java的InputStream和OutputStream的理解【转】

    1.在java中stream代表一种数据流(源),javaio的底层数据元,---(想像成水龙头)2.任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象既然它能产生 ...

  4. 利用 Gulp 处理前端工作流程

    最近做项目,因为每次做完后都要手动压缩CSS.JS 等文件,压缩后另存为 *.min.xxx. Less 还要手动输入命令进行编译,调整页面也经常要手动刷新页面看效果,很麻烦,就尝试用 gulp 去处 ...

  5. svn 命令行创建和删除 分支和tags

    创建分支 svn cp -m "create branch" http://svn_server/xxx_repository/trunk http://svn_server/xx ...

  6. Ubuntu mongodb 安装和配置

    安装 MongoDB sudo apt-get install mongodb sudo apt-get install mongodb 关闭/启动 sudo service mongodb stop ...

  7. git push throws error: RPC failed; result=22, HTTP code = 411的解决办法

    原因:默认 Git 设置 http post 的缓存为 1MB,将其设置为 500MB 解决办法如下: git config http.postBuffer 524288000

  8. 使用Innosetup制作安装包的一些技巧

    1. 选择安装界面上的图片 [Setup] ;设置界面上的两个图片 WizardImageFile=WizModernImage.bmp WizardSmallImageFile=WizSmallIm ...

  9. WordPress建站指南

    WordPress建站指南(1)   写在前面: 3月份用10天零碎时间火速完成了建站,后台95%的工作都交给了WP(WordPress).如果想偷懒的话,WP是一个绝好的选择,估计有个小半天就建完收 ...

  10. C#将Enum枚举映射到文本字符串

    介绍 当将以前的C代码移植到C#中时,我快发疯了,因为有很多的数组需要将常量映射到字符串.当我在寻找一个C#的方法来完成的时候,我发现了一个自定义属性和映射的方法. 如何使用代码? 对每一个enum枚 ...