天天看點

SQLSERVER到底能識别多少個邏輯CPU?

SQLSERVER到底能識别多少個邏輯CPU?

前言

在前幾天在論壇有人遇到SQLSERVER識别邏輯CPU的問題

文章位址:

http://social.technet.microsoft.com/Forums/zh-CN/f8235ab2-4e46-4aea-81da-699d84b3b57b/sql-server-2005-

http://social.technet.microsoft.com/Forums/zh-CN/6fd788d3-014e-44bc-99f3-b962f4f041c7/sql-server-2005-x64-sp4-

環境

LZ當時的環境是這樣的:

作業系統:Windows Server 2008 R2 企業版 SP1

高可用配置:群集

資料庫:SQLSERVER 2005 企業版 64位  SP4 

伺服器硬體配置:

CPU:HP DL980 G7 4*10核心 2.00 G主頻  有超線程功能

記憶體:256GB

SQLSERVER的情況

LZ當時描述說:他當時開啟了超線程

作業系統能識别得到80個邏輯CPU(在任務管理器裡看)

SQLSERVER到底能識别多少個邏輯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到底能識别多少個邏輯CPU?

論壇說法

而在文章中兩位仁兄都給出了各自的說法:

說法一:

當你在同一個叢集上有多個SQLSERVER執行個體,最好把這些處理器劃分開,供給多個執行個體使用。對于任何一個SQLSERVER執行個體

不能使用“自動設定所有處理器關聯掩碼”

SQLSERVER到底能識别多少個邏輯CPU?

rmiao的意思是說,不能勾選“自動設定所有處理器的處理器關聯掩碼”,以防止叢集的某一個執行個體将所有邏輯CPU資源都用盡了

說法二:

按照MSDN的說法,SQLSERVER2005企業版是支援作業系統最大處理器數目的

SQLSERVER到底能識别多少個邏輯CPU?

對于這個情況,怡紅公子給出了下面内容的連結:

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 整型)

SQLSERVER到底能識别多少個邏輯CPU?
SQLSERVER到底能識别多少個邏輯CPU?

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.

準備下面的表:

SQLSERVER到底能識别多少個邏輯CPU?

注意:你必須配置設定親近域 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"      
SQLSERVER到底能識别多少個邏輯CPU?

導入成功

SQLSERVER到底能識别多少個邏輯CPU?

例子2: 你希望配置節點0x11 和 0x12 到編組 0, 節點 0x13 到編組 1, 然後節點 0x14 到編組 2.

例子2跟例子1是差不多的,這裡就不翻譯了

重新開機電腦組態就會生效。如果配置不正确(資料内容長度錯誤,親近IDs不對,或者定義了不合法的編組),手工編組配置設定就會被忽略,

啟動機器時不會按照編組配置設定定義那樣去配置設定編組

完成了手工編組配置設定之後,重新開機計算機,有兩種方法驗證目标機器的NUMA配置編組配置設定是否被正确應用

方法一:使用Perfmon(性能螢幕)添加計數器,選擇“處理器資訊”計數器,檢視傳輸的元祖(NUMA節點,看處理器在零基線裡)

這裡隻會顯示有多少節點展現出來,和在每個節點裡有多少處理器

方法二::使用任務管理器,使用這個方法,你能看到節點與編組的映射。選擇處理器頁籤, 右擊每個處理器,

選擇“設定掩碼。。。”,然後檢視哪些節點在哪個編組。這裡會顯示每個編組都有哪些節點

總結

按照上面那篇文章所說的,那麼msdn上說的“SQLSERVER2005企業版是支援作業系統最大處理器數目的” 不是很正确

SQLSERVER到底能識别多少個邏輯CPU?

最後,個人感覺說法二比較靠譜一些,大家認為呢?

補充:

處理器編組相關文章:

http://blogs.msdn.com/b/psssql/archive/2009/06/16/sql-server-on-windows-7-windows-2008-r2-with-more-than-64-cpus.aspx

NUMA相關文章:

http://blogs.msdn.com/b/manisblog/archive/2007/09/17/scale-up-with-sql-server-2005-sql-server-2008-numa.aspx

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