SQLSERVER到底能識別多少個邏輯CPU?
前言
在前幾天在論壇有人遇到SQLSERVER識別邏輯CPU的問題
帖子地址:
環境
LZ當時的環境是這樣的:
操作系統:Windows Server 2008 R2 企業版 SP1
高可用配置:群集
數據庫:SQLSERVER 2005 企業版 64位 SP4
服務器硬件配置:
CPU:HP DL980 G7 4*10核心 2.00 G主頻 有超線程功能
內存:256GB
SQLSERVER的情況
LZ當時描述說:他當時開啟了超線程
操作系統能識別得到80個邏輯CPU(在任務管理器里看)

如果操作系統能識別80個邏輯CPU表明:
4顆10核2.00處理器 ,每核心雙線程(4*10*2=80),也就是80個邏輯處理器(每個線程代表一個邏輯CPU)
或者
4顆10核2.00處理器 ,每核心一個線程,但是使用了超線程技術之后變為每核心雙線程(4*10*2=80),
也就是80個邏輯處理器(每個線程代表一個邏輯CPU)
LZ說:在sql server 2005中數據庫屬性處理器一項中只能識別cpu0-cpu59,並且群集切換后,另一台接管資源節點只能識別到20顆邏輯處理器。
只能識別到60個邏輯CPU

論壇說法
而在帖子中兩位仁兄都給出了各自的說法:
說法一:
當你在同一個集群上有多個SQLSERVER實例,最好把這些處理器划分開,供給多個實例使用。對於任何一個SQLSERVER實例
不能使用“自動設置所有處理器關聯掩碼”

rmiao的意思是說,不能勾選“自動設置所有處理器的處理器關聯掩碼”,以防止集群的某一個實例將所有邏輯CPU資源都用盡了
說法二:
按照MSDN的說法,SQLSERVER2005企業版是支持操作系統最大處理器數目的

對於這個情況,怡紅公子給出了下面內容的鏈接:
64位的Windows7和Windows Server2008 R2為了能夠在一台機器上,支持超過64個邏輯CPU ,引入了Process Group的概念
他會把一些邏輯CPU編成一個組,但是一個組內的邏輯CPU總數不能超過64個,否則將編入另外一個組
而且,分配邏輯CPU的工作也不一定是平均的。操作系統會在重啟的時候,根據邏輯CPU之間的物理遠近,自動進行編組。
例如,重啟后可能變成20或者60核。
由於Process Group這個概念是在Windows2008才引入的。當開發SQLSERVER2008的時候, 並沒有做相應的變化,
所以SQLSERVER2008是無法支持這個功能的。升級到SQLSERVER2008 R2就可以解決這個問題。
他最多可以同時檢測到256個邏輯CPU。
如果不能升級到SQLSERVER2008 R2的話,可以人工干預Process Group的編組, 把第一個Process Group設置為64核,
以盡可能多的利用CPU,不過操作系統必須是64位Windows2008R2或64位Windows7或以上操作系統才能手工設置
關於如何設置Process Group編組,具體可以參考:http://support.microsoft.com/kb/2506384/zh-cn
翻譯
我翻譯了一下如何設置Process Group編組這篇文章
標題:如何在多處理器機器上手工設置處理器編組
概述
處理器編組的手動設置分配是在64位操作系統Windows Server 2008 R2開始的,並且應用在
超過64個邏輯CPU的NUMA(非統一內存架構)架構系統上。處理器編組設置允許
administrator系統管理員為處理器編組指定一個靜態的NUMA節點,這樣比讓Windows在開機啟動的時候動態
分配NUMA節點給處理器編組要好
注意:OEM廠商可以在OEM系統出廠之前為系統配置最優化的處理器編組
更多信息
在以前缺少手工設置處理器編組的時候,Windows以最小的編組的方式分配NUMA節點到編組里面。
Windows以自身的經驗評估從之前啟動時最小節點距離去分配每個處理器編組之間內部的節點距離。
administrator系統管理員可以使用以下兩個方法的其中一個去重置自動編組分配:
第一個使用BCDEdit
第二個使用修改注冊表
注意:Windows Server2008R2 使用下面的重置優先級:
手工修改注冊表的優先級大於重置BCDEdit設置;然后,BCDEdit設置會覆蓋操作系統的自動編組分配
也就是說優先級依次是:手工修改注冊表>BCDEdit設置>操作系統的自動編組分配
使用 BCDEdit去配置編組分配
administrator系統管理員能夠利用BCDEdit去覆蓋掉默認編組分配,BCDEdit允許改變編組的大小和最大編組。
這個設置方法你可以在MSDN里的“修改操作系統啟動參數去驅動測試多處理器編組支持”文章找到
文章地址:http://msdn.microsoft.com/en-us/library/ff542298(VS.85).aspx
相關命令:
1 --設置最大編組大小 2 bcdedit.exe /set groupsize maxsize 3 --設置一個編組內只能有2個邏輯處理器 4 bcdedit.exe /set groupsize 2 5 --還原為默認的編組大小 6 bcdedit.exe /deletevalue groupsize 7 --開啟最大化編組大小 8 bcdedit.exe /set maxgroup on 9 --關閉最大化編組大小 10 bcdedit.exe /set maxgroup off 11 12 bcdedit.exe /set groupaware on 13 bcdedit.exe /set groupaware off
使用手工修改注冊表去配置處理器編組
第二個手工配置處理器編組的方法就是通過根據特定系統的首選NUMA特征去添加注冊表參數
1 Key: HKLM\System\CurrentControlSet\Control\NUMA 2 3 Value: “Group Assignment” 4 5 Type: REG_BINARY
在注冊表的HKLM\System\CurrentControlSet\Control位置添加新建NUMA項目
在NUMA項目里新建二進制值Group Assignment
而內容為:
Proximity Domain Count (N)
Proximity ID of domain 0
Group assignment for domain 0
Proximity ID of domain 1
Group assignment for domain 1 ...
Proximity ID of domain N-1
Group assignment for domain N-1
內容里的值是一系列的ULONG數據類型的值(4字節 unsigned 整型)


Boot System Processor (BSP) :一個系統中有多個邏輯CPU的時候,當操作系統啟動的時候只會
利用到一個邏輯CPU 其他的邏輯CPU在操作系統啟動的時候是不活動的,這個邏輯CPU稱為Boot System Processor (BSP)
重要:確保分配親近的域包含BSP到組0。Windows確保BSP有組掩碼(組0,號碼0)
場景
例如,考慮下面的場景, 一個機器有80個邏輯處理器平均分配到4個NUMA節點當中, 電腦的BIOS資源掩碼表(SRAT)
定義了NUMA節點與ID親近:0x11, 0x12, 0x13, 0x14. 用於系統啟動的那個邏輯CPU(BSP)與域 0x11親近
下面是兩個描述了如何去手動分配節點的場景 例子1:
你希望分配節點0x11 和 0x12 到編組0, 然后 節點0x13 和 0x14 到編組 1.
准備下面的表:

注意:你必須分配親近域 ID 0x11 到編組0 因為域 ID 0x11 包含了 BSP.
根據上面這個表去配置注冊表,從最右面的列(Value as ULONG)連接所有的4字節ULONG類型值到一個單一的long類型二進制制。
運行下面的腳本 ,將他保存為bat文件,然后雙擊運行
1 reg.exe add HKLM\System\CurrentControlSet\Control\NUMA /v "Group Assignment" /t REG_BINARY /f /d "040000001100000000000000120000000000000013000000010000001400000001000000"

導入成功

例子2: 你希望配置節點0x11 和 0x12 到編組 0, 節點 0x13 到編組 1, 然后節點 0x14 到編組 2.
例子2跟例子1是差不多的,這里就不翻譯了
重啟電腦配置就會生效。如果配置不正確(數據內容長度錯誤,親近IDs不對,或者定義了不合法的編組),手工編組分配就會被忽略,
啟動機器時不會按照編組分配定義那樣去分配編組
完成了手工編組分配之后,重啟計算機,有兩種方法驗證目標機器的NUMA配置編組分配是否被正確應用
方法一:使用Perfmon(性能監視器)添加計數器,選擇“處理器信息”計數器,查看傳輸的元祖(NUMA節點,看處理器在零基線里)
這里只會顯示有多少節點展現出來,和在每個節點里有多少處理器
方法二::使用任務管理器,使用這個方法,你能看到節點與編組的映射。選擇處理器選項卡, 右擊每個處理器,
選擇“設置掩碼。。。”,然后查看哪些節點在哪個編組。這里會顯示每個編組都有哪些節點
總結
按照上面那篇文章所說的,那么msdn上說的“SQLSERVER2005企業版是支持操作系統最大處理器數目的” 不是很正確

最后,個人感覺說法二比較靠譜一些,大家認為呢?
補充:
處理器編組相關文章:
NUMA相關文章:
http://blogs.msdn.com/b/psssql/archive/2008/01/24/how-it-works-sql-server-2005-numa-basics.aspx
---------------------------------------------------------------------
2013-9-16補充:
最后LZ的解決了問題,大家可以參考下面這篇文章
http://blogs.msdn.com/b/apgcdsd/archive/2011/09/05/windows-2008-r2-sql-server-2008-cpu.aspx
如有不對的地方,歡迎大家拍磚o(∩_∩)o
