SQLSERVER中的NUMA架構


SQLSERVER中的NUMA架構

之前看了園子里的宋大俠《淺談SQL Server 對於內存的管理》的文章,里面講到NUMA架構,究竟NUMA架構是啥東西

網上的資料說得讓人一頭霧水

剛好上星期在MSDN上找到一篇關於NUMA架構的文章,文章是2011年寫的,現在分享給大家o(∩_∩)o 


文章:SQL SERVER在NUMA架構下實現性能最佳化

就目前而言,CPU主頻速度的迅速提升以及CPU數量的高速增長,並沒有能夠促使CPU在訪問內存時的速度有所長進。

盡管L3 Cache的提出解決了部分問題,不過,CPU訪問內存速度慢的現象並未有所改觀,瓶頸依然存在。

為了更有效的解決CPU訪問內存的速度問題,工業界引入了NUMA概念

首先介紹一下 NUMA  的架構,如下圖:

 

 每個 NUMA 節點(硬件 NUMA 或軟件 NUMA)都有一個用於處理網絡 I/O 的相關 I/O 完成端口,這有助於跨多個端口分布網絡 I/O 處理

上述結構中展現出兩個NUMA結點,每個NUMA結點有一些CPU, 一個內部總線,和自己的內存,甚至可以有自己的IO。每個CPU有離自己最近的內存可以直接訪問。

所以,使用NUMA架構,系統的性能會更佳。值得注意的是,在NUMA結構下,可以比較方便的增加CPU的數目。

而在非NUMA架構下,增加CPU會導致系統總線負載很重,性能提升不明顯。

雖然每個CPU也可以訪問其他NUMA結點上的內存,但付出的代價則是導致速度更慢,這是要盡量避免的。

應用軟件如果沒有意識到這種結構,在NUMA機器上,有時候性能會更差,這是因為,他們經常會不自覺的去訪問遠端內存,從而導致整體性能下降。

通常而言,NUMA架構也有硬件和軟件之分

 

一、硬件NUMA

硬件NUMA是在硬件層面上得以支持。如何才能知道本機是否有硬件NUMA呢? 最好的辦法是問硬件供應商了。

但如果想知道機器中有多少個NUMA結點,那就可以在SQL Server Management Studio下用如下的查詢,看能返回幾個NUMA結點

1 SELECT DISTINCT memory_node_id FROM sys.dm_os_memory_clerks

或者,可以查看SQL Server的錯誤日志,如下面的錯誤日志表明,系統有兩個NUMA結點

從 SQL Server 2000 SP3 以后,SQL Server開始支持NUMA架構,內存訪問會盡量使用離CPU最近的內存,以提高性能。

二、軟件NUMA

如果硬件本身不支持NUMA,還可以在軟件層面上設置NUMA,如機器有4個CPU, 設成兩個NUMA NODE

一個NODE占用CPU 0x11 (二進制編碼),另外一個NODE占用CPU 0x1100 (二進制編碼)。

那么,可以在注冊表上做如下修改,以SQL Server 2008為例:

軟件NUMA只是對CPU進行分組,並不會改變內存。因此對於內存來講,還是只有一個結點,所以兩個NUMA結點,訪問的都是同一塊內存。

而增加軟件NUMA結點的好處在於,SQL Server會針對每一個軟件NUMA結點,多一個LazyWriter的線程,

如果系統在LazyWriter上是性能瓶頸的話,引入Software NUMA則可以有效提升性能。

在服務器屬性這個地方設置的只是軟件NUMA,要機器真正支持硬件NUMA才是真正的NUMA

 

面對連接層面的NUMA

SQL Server 不僅僅在引擎上支持NUMA,在連接層面上也支持NUMA。

如果沒有在連接層面上對NUMA進行設置的話,那么每一個連接進來,SQL Server會根據round-robin方式,選擇NODE 進行處理。

在NODE內部,SQL Server會選擇CPU負載最低的一個CPU進行處理。而這種方法的缺點是,有可能某一個NODE內的所有CPU都很忙,

但是另外一個NODE內的所有CPU都很空,從而導致資源不均衡。這種情況下,使用NUMA架構時性能反而會下降,還不如使用非NUMA架構,

系統能均衡分配CPU資源。

如下圖所示,采用round-robin方式,可能NUMA NODE 0會非常繁忙,而NUMA NODE 1會非常空閑,系統資源不能充分利用。

重要的連接可能會被分配到NODE 0,導致不能得到及時處理,性能受到影響。

對此,可以在連接層面上進行設置。對於重要的操作,使用端口1450,該端口會綁定NUMA結點0、1,、2,

而對於不重要的操作(可能需要耗費大量資源,但不重要的),則使用端口1433,該端口會綁定NUMA結點3,

如此,不重要的操作不會對重要的操作在性能上有所影響

如何設置端口對NUMA結點的綁定?可以在偵聽的端口后面加NUMA結點信息。如有八個NUMA結點,如果要使用NUMA結點0, 2, 5 那么根據MASK方式,

相應的數值是0x25,37

 

在SQL Server的網絡設置中,相應的網絡偵聽端口后面,我們可以加MASK數值,如下,

這樣,端口63409進來的連接,會跟NUMA結點0, 2, 5 進行綁定。

應該在配置管理器那里設置,我的是SQL2005

綜上所述,NUMA概念的引入,將大大地提升硬件的可擴展性和處理能力。

SQL Server 從硬件NUMA、軟件NUMA及連接上分別對NUMA這個體系架構做了優化支持,因此,NUMA架構下,SQL Server擁有更佳的性能和更好的擴展。


 

SQL Server 如何支持 NUMA

文章地址:http://msdn.microsoft.com/zh-cn/library/ms180954(v=SQL.105).aspx

這里我摘抄一些重要部分算了

公共 CPU 的分組
SQL Server 對計划程序進行分組,以根據 Windows 所顯示的硬件 NUMA 邊界將這些計划程序映射到 CPU 的分組。

例如,16 路邏輯單元有 4 個 NUMA 節點,每個節點有 4 個 CPU。這使得在節點上處理任務時,該組計划程序具有更多的本地內存。

使用 SQL Server,您可以進一步將與硬件 NUMA 節點關聯的 CPU 細分為多個 CPU 節點。這稱為軟件 NUMA。

通常,您將細分 CPU 以跨 CPU 節點對工作進行分區。

 

名詞解釋:

16 路邏輯單元:說的是16個邏輯CPU,什么是邏輯CPU,比如酷睿I3cpu 雙核四線程,那么四線程實際上就是四個邏輯CPU

四個邏輯CPU是指在同一個時間點,可以同時運算的計算單元,運行四個線程,處理四個任務在同一個時間點

計划程序:就是SQLOS里面的 scheduler,詳細可以看我這篇文章  SQLSERVER獨特的任務調度算法"SQLOS"

 

 

繼續摘抄:--------------------------------------------------------------------------------------------------------------------

每個 NUMA 節點(硬件 NUMA 或軟件 NUMA)都有一個用於處理網絡 I/O 的相關 I/O 完成端口,這有助於跨多個端口分布網絡 I/O 處理。

當某個客戶端連接到 SQL Server 時,將綁定到其中一個節點。此客戶端的所有批處理請求都將在該節點上處理

 

上面這句話是對上面哪兩個圖的很好解釋

 

軟件 NUMA 針對計算機中的所有 SQL Server 實例定義一次,因此,多個數據庫引擎實例都能看到同樣的軟件 NUMA 節點。

然后,每個數據庫引擎實例都使用 affinity mask 選項選擇相應的 CPU。接着,每個實例都使用與這些 CPU 關聯的任何軟件 NUMA 節點

這句話說的就是服務器屬性里面的CPU掩碼

 

Windows 在啟動后,從硬件 NODE 0 為操作系統分配內存。

因此,硬件 NODE 0 可用於其他應用程序的本地內存少於其他節點。

當需要緩存一個大型文件時,此問題尤為突出。當 SQL Server 在具有多個 NUMA 節點的計算機中啟動時,它將嘗試在 NODE 0 以外的 NUMA 節點上啟動

 

如何將連接分配到 NUMA 節點
TCP 和 VIA 都可以將連接關聯到一個或多個特定 NUMA 節點。當未進行關聯,或使用 Named Pipes 或 Shared Memory 進行連接時,

連接將采用循環方式分布到 NUMA 節點。在 NUMA 節點內,連接按照該節點上負載最小的計划程序運行。由於新連接的分配具有循環性,

因此,當某個節點空閑時,另一個節點中的所有 CPU 可能都處於繁忙狀態。如果您的 CPU 非常少(如 2 個),

並且看到由於具有長時間運行的批處理(如大容量加載)而導致龐大的計划不均衡,則在這種情況下,關閉 NUMA 可能會提高性能。

 

這句話同樣也是上面兩個分配連接的截圖的補充解釋

 

SQL Server 版本限制
從 SQL Server 2000 到 Service Pack 3,都不包括對 NUMA 的特別支持;

但是,Service Pack 4 有一些有限的 NUMA 優化。SQL Server 2005 有了大量重要的改進

,因此,我們極力鼓勵 NUMA 用戶升級到 SQL Server 2005 以充分利用 NUMA 體系結構

 


我的個人理解

SQLSERVER2008支持硬件NUMA,SQLSERVER2005只支持軟件NUMA

假如一台電腦有兩個物理NUMA節點(當然前提是電腦要支持NUMA),那么內存可以分成兩份

SQL2008可以直接訪問這兩份內存

SQL2005 只能訪問同一份內存


(引用一下宋大俠的一些圖片)

NUMA節點的概念

邏輯CPU:代表多少個線程

core:代表多少個核心

numa node:numa節點

socket:socket通訊

例如:酷睿I3 雙核四線程,那么邏輯CPU(logical cpu)有4個,core有2個

 

SQL Server OS在SMP硬件 直接訪問同一個內存  方向 是自下向上

SQL Server OS在NUMA硬件  將一份物理內存分成兩份 方向 是自下向上

 

寫完了,睡覺去了~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM