前言web
在前幾天在論壇有人遇到SQLSERVER識別邏輯CPU的問題sql
帖子地址:數據庫
環境架構
LZ當時的環境是這樣的:dom
操做系統: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