SQLSERVER中的NUMA架構
之前看了園子里的宋大俠《淺談SQL Server 對於內存的管理》的文章,里面講到NUMA架構,究竟NUMA架構是啥東西
網上的資料說得讓人一頭霧水
剛好上星期在MSDN上找到一篇關於NUMA架構的文章,文章是2011年寫的,現在分享給大家o(∩_∩)o
就目前而言,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硬件 將一份物理內存分成兩份 方向 是自下向上
寫完了,睡覺去了~~