1. 程式人生 > >在Windows 2008 R2高階機器上執行SQL Server 2008時,CPU個數的考量

在Windows 2008 R2高階機器上執行SQL Server 2008時,CPU個數的考量

我們知道SQL Server所能檢測到的CPU是邏輯CPU個數。而不是物理CPU個數。雙核CPU對於SQL Server來講,是兩個邏輯CPU,如果有超執行緒的話,CPU個數還要翻一倍。邏輯CPU個數,通常能在Windows 的Task Manager裡顯示出來, 在CPU Usage History裡,有多少個框,就有多少個邏輯CPU

【問題】

但是在有一些很高階的機器上,我們會發現一些比較有趣的現象。SQL Server所能檢測到的CPU個數,竟然和邏輯CPU個數不符合。

如下面的機器配置,有4個物理CPU, 每個CPU上有10個Cores, 而且也enable了超執行緒。所以這臺機器上,總共有80個邏輯CPU,按道理,SQL Server應該能檢測到80個CPU才對。

但我們檢視SQL Server的錯誤日誌,SQL Server 竟然只能檢測到40個CPU.

在另外一臺相同配置的機器上,SQL Server 重啟後,有時候能檢測到20個CPU, 有時候能檢測到60個CPU。

SQL Server能檢測到的CPU個數竟然會隨著SQL Server重啟,而有所變化。本來SQL Server效能很好,重啟後,SQL Server能使用的CPU變成20了,效能就會變得很差。這對於很高階的應用來講,是不能接受的。

【調查】

對於這個非常奇怪的現象,我們似乎是無從下手,難道是SQL Server的版本限制?但是我們的SQL Server版本已經是Enterprise了, 好像是SQL Server的一個Bug, 但是又不能確定。

調查一

我們做了進一步的研究。我們知道,SQL Server所檢測到的CPU個數,是通過呼叫下面的函式所得到的:

SYSTEM_INFO siSysInfo;

GetSystemInfo(&siSysInfo);

printf("  Number of processors: %u\n", siSysInfo.dwNumberOfProcessors);

我們寫了一個repro程式,完整的程式碼如下:

// SystemInfo.cpp : Defines the entry point for the console application.

#include "stdafx.h"

#include <windows.h>

#include <stdio.h>

#pragma comment(lib"user32.lib")

int _tmain(int argc, _TCHAR* argv[])

{

   SYSTEM_INFO siSysInfo;

   // Copy the hardware information to the SYSTEM_INFO structure.

   GetSystemInfo(&siSysInfo);

   // Display the contents of the SYSTEM_INFO structure.

   printf("Hardware information: \n"); 

   printf("  OEM ID: %u\n", siSysInfo.dwOemId);

   printf("  Number of processors: %u\n", siSysInfo.dwNumberOfProcessors);

       return 0;

}

編譯執行上述程式碼,問題能夠重現:

D:\TEMP>systeminfo_x64.exe

Hardware information:

  OEM ID: 9

  Number of processors: 60

D:\TEMP>systeminfo_x64.exe

Hardware information:

  OEM ID: 9

  Number of processors: 20

D:\TEMP>systeminfo_x64.exe

Hardware information:

  OEM ID: 9

  Number of processors: 20

D:\TEMP>systeminfo_x64.exe

Hardware information:

  OEM ID: 9

  Number of processors: 60

所以,到了這一步,我們可以判定,問題跟SQL Server無關。但是為什麼GetSystemInfo() 得到的CPU個數會變來變去呢?難道是GetSystemInfo() 這個API的Bug?

調查二

我們仔細研究了GetSystemInfo這個API, 其中,_SYSTEM_INFO 這個結構描述在:

dwNumberOfProcessorsThe number of logical processors in the current group

這裡,”current group” 這個詞引起了我們的注意。

調查三

我們做了進一步研究,發現在Windows 7和Windows Server 2008 R2 裡,我們引入了Processor Group 這個概念, 具體描述在http://msdn.microsoft.com/en-us/library/dd405503(v=vs.85).aspx  簡單的講,64位的Windows7和Windows Server 2008 R2為了能夠在一臺機器上,支援超過64個邏輯CPU, 引入了Processor Group這個概念。Processor Group會把一些邏輯CPU編成一個組,但是一個組內的邏輯CPU總數不能超過64個。超過64個的話,要編入另外一個組。

所以,對於我們的系統,有80個邏輯CPU, 那麼就會編成兩個組。是不是每個組均勻的分配CPU呢,不是的。作業系統會在重啟的時候,根據邏輯CPU之間的物理遠近,自動進行編組。所以,在有的系統上,我們會看到40-40分配,在另外系統上,我們會看到20-60分配。

那麼,每當一個程序執行的時候,它會在哪個Processor Group上執行呢? 作業系統會按照Round-robin方式,給每個程序分派Processor Group, 一旦一個進行分配到了一個Processor Group, 就會一直在這個Processor Group裡執行,直到該程序結束為止。

【解釋】

所以,這就解釋了,為什麼SQL Server 2008 有時候能檢查到20個CPU, 有時候能檢查到60個CPU, 這完全是因為Processor Group在起作用。每次SQL Server 重新啟動後,有可能被分配到另外一個Processor Group, 而導致能檢查到的CPU個數出現變化。

我們可能會問,為什麼SQL Server 2008 會通過呼叫GetSystemInfo(&siSysInfo); 的辦法來獲取邏輯CPU個數呢?難道不能用其他API麼?這是因為,Processor  Group這個概念是在Windows Server 2008 才引入的。當開發SQL Server 2008的時候,並沒有做相應的變化。當然,這個問題在SQL Server 2008 R2得以解決。SQL Server 2008 R2能最多同時檢測到256個邏輯CPU.

【解決方案】

最好的解決方案是把SQL Server 2008 升級到SQL Server 2008 R2. 如果短期內不可行的話,我們可以把超執行緒禁用。這樣系統上邏輯CPU的個數會變成40個。小於64個,所有的CPU會被編入一個組。雖然SQL Server能檢測到的CPU只有40個,但至少系統是穩定的。

我們可能還會問,是否有辦法,能否人工干預Processor Group的編組,一個組有64個CPU, 另外一個組有16個CPU?  對於NUMA架構的話,我們可以做一些適當的調整,具體可參考: http://support.microsoft.com/kb/2506384

另外,如果我們碰到Processor Group按20-60分配的情況,對系統整體效能是有影響的。建議打一個作業系統的補丁:

Performance issues when more than 64 logical processors are used in Windows Server 2008 R2

http://support.microsoft.com/default.aspx?scid=kb;EN-US;2510206

相關推薦

Windows 2008 R2高階機器執行SQL Server 2008CPU個數考量

我們知道SQL Server所能檢測到的CPU是邏輯CPU個數。而不是物理CPU個數。雙核CPU對於SQL Server來講,是兩個邏輯CPU,如果有超執行緒的話,CPU個數還要翻一倍。邏輯CPU個數,通常能在Windows 的Task Manager裡顯示出來, 在CPU Usage Histo

windows server 2012 R2安裝sql server 2008失敗

因為要搭建TW平臺,需要在雲主機上安裝sql server 2008,安裝過程中總是提示未安裝windows powershell,但是當下載了各個版本的powershell之後進行安裝,又提示已經安裝過了,人都要崩潰了... 然後用角色管理工具,新增功能裡面,找到powe

在Win7 64位電腦安裝Sql Server 2008 R2 Express

技術分享 下載網址 com 操作系統 參考 默認 title 安裝 英文 安裝環境說明: 操作系統:Win7 64位 英文版 安裝步驟: 1、準備安裝文件 下載網址:https://www.microsoft.com/zh-CN/download/detai

win8安裝sql server (2008 and 2008 R2)存在相容性問題怎麼解決

 安裝sql2008R2之前,需要先下載“AccessDatabaseEngine”元件並安裝(百度上搜索下載就可以了),打補丁重啟,再安裝sql2008,安裝時候提示相容性問題,選擇執行程式而不

在虛擬機器安裝win server 2008 r2 或者 在虛擬機器安裝映象

 準備在vmWare上安裝一個windows Server2008 r2 步驟一: 首先去微軟官網上下載一個系統映象檔案: 如上圖所示選中下載地址如果已經安裝迅雷的話可以直接按ctr + c 會自動啟動下載,如下所示: 步驟二:啟動vmware

執行sql server 2008 無法連線到伺服器 錯誤2的解決辦法

今天開啟sqlserver的時候出現了法連線到伺服器 錯誤2 。然後開始百度 解決方法為:sql伺服器沒有開,開始—控制面板—管理工具—服務 然後啟動 Sql Server(MSSQLSERVER)

安裝SQL Server 2000提示另一個SQL Server安裝程式例項已在執行的解決辦法

    1.開啟登錄檔編輯器,在     HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session   Manager中找到PendingFileRenameOperations專案,並刪除它     2.把剛剛裝

在建立與伺服器的連線出錯。在連線到SQL Server 2005在預設的設定不允許進行遠端連線在建立與伺服器的連線出錯。

在建立與伺服器的連線時出錯。在連線到SQL Server 2005時,在預設的設定不允許進行遠端連線,在建立與伺服器的連線時出錯。在連線到SQL Server 2005時,在預設的設定下SQL Server 不允許進行遠端連接可能會導致此失敗。 1. 開啟sql2005遠端連線功能,開啟辦法如下

sql server update是行鎖還是表鎖

https://bbs.csdn.net/topics/120000749 http://www.cnblogs.com/s021368/articles/2148659.html 問題: udpate  a   set   column1   =  

遷移sql server例項對應的賬戶該如何遷移

https://support.microsoft.com/en-us/help/918992/how-to-transfer-logins-and-passwords-between-instances-of-sql

windows server 2008 R2 SP1 安裝SQL Server 2008 R2提示 "此操作系統不支持此版本的 SQL Server 版本"

企業版 支持 span ask 原因 提示 64位 福利 版本 windows server 2008 R2 SP1 安裝SQL Server 2008 R2時提示 "此操作系統不支持此版本的 SQL Server 版本" 原因: 安裝的時候輸入了標準版的key ,

配置Windows 2008 R2 防火墻允許遠程訪問SQL Server 2008 R2

之間 管理器 nbsp serve tcp/ip 查找 firewall window ros 1.先修改 sql server 2008R2的端口號吧,1433經常成為別人入侵的端口,在sql server 配置管理器 --》sql server 網絡配置--》MSSQL

Windows Server 2008 R2 Server連接其他服務器的數據庫遇到“未啟用當前數據庫的 SQL Server Service Broker因此查詢通知不受支持。如果希望使用通知請為此數據庫啟用 Service Broker ”

lba pos 數據庫名 nbsp bsp enable 輸入 images logs 項目代碼和數據庫部署在不同的Windows Server 2008 R2 Server中,錯誤日誌顯示如下: "未啟用當前數據庫的 SQL Server Service Broker,因

Windows Server 2008伺服器訪問SQL Server異常慢(SQL資料庫設定為空密碼情況下)

這兩天把工作主機從Windows Server 2003 R2 換成了 Windows Server 2008 R2  , 在連線遠端 SQL SERVER 2000  中,如果SQL資料是空密碼,就會異常慢或連線不上。如: 企業管理器 註冊網路SQL SERVER 時,異常

Windows Server 2008 R2虛擬機器安裝VMware Tools

1、喚出"VMware Workstation 10"程式視窗,如圖所示。展開左側樹形目錄結構,點選"Windows Server 2008 R2 x64"項。 2、如圖所示,喚出"Windows Server 2008 R2 x64"使用者介面。選擇選單欄"虛擬機

windows server 2008 R2 虛擬機器應用

今天終於用上windows server 2008 R2虛擬機器(Hyper-V),大概的開通步驟: 一、開啟CPU的虛擬化功能(BIOS的處理器設定項中有,如果沒有你的伺服器落伍了喲) 二、在伺服器管理器中新增 Hyper-V功能,如下圖 三、開啟Hyper-V管理器,

Windows 2008 R2 64位安裝wamp失敗的原因

    因測試PHP程式需要,需要在windows系統上佈署WAMP環境測試程式,對效能不作具體要求,選擇WAMP Server進行快速佈置。     系統環境:Windows 2008 R2     按照正常windows安裝程式,完成WAMP Server程式安裝,

SQL Server 2008 R2 超詳細安裝圖文教程

jpg ces ads 默認 點擊 引擎 nal 功能 ear 數據庫視頻將近看完了,但是SQL Server 一直都沒有親自動手安裝過,所以一直都不會安裝,今天自己動手安裝了兩次,總算是安裝成功了,以下是自己安裝的全過程: 運行程序後,點擊安裝

sqlserver 下載地址(SQL Server 2008 R2 中英文 開發版/企業版/標準版 下載)

span 標準 bd09 pub add sina 4.0 published div 轉自:http://blog.sina.com.cn/s/blog_624b1f950100pioh.html 註:企業版無法安裝在xp和win7,開發版才可以! 一. 簡體

sql server 2008 r2 無法定位到數據庫文件目錄

src logs 子目錄 數據 屬性 添加 文件目錄 無法定位 ges 像這樣,選擇數據庫文件時, 無法定位到文件夾目錄,子目錄下的都不顯示。明明選擇的這個文件夾裏還有很多子文件夾,卻顯示不了。 解決方法: 在此文件夾上右擊,屬性-安全 添加紅框中的用戶就可以