說到服務器的NUMA架構,你們或許都知道。NUMA架構在中大型系統上一直很是盛行,也是高性能的解決方案,尤爲在系統延遲方面表現都很優秀。但NUMA架構對服務器的相關性能到底有什麼影響,怎樣設置會更好呢?本文在此解析一下。git
一、什麼是NUMA數據庫
NUMA(Non Uniform Memory Access Architecture)是一種用於多處理器的電腦記憶體設計,內存訪問時間取決於處理器的內存位置。 在NUMA下,處理器訪問它本身的本地存儲器的速度比非本地存儲器(存儲器的地方到另外一個處理器之間共享的處理器或存儲器)快一些。安全
NUMA架構在邏輯上遵循對稱多處理(SMP)架構。 它是在二十世紀九十年代被開發出來的,開發商包括Burruphs (優利系統), Convex Computer(惠普),意大利霍尼韋爾信息系統(HISI)的(後來的Group Bull),Silicon Graphics公司(後來的硅谷圖形),Sequent電腦系統(後來的IBM),通用數據(EMC), Digital (後來的Compaq ,HP)。 這些公司研發的技術後來在類Unix操做系統中大放異彩,並在必定程度上運用到了Windows NT中。服務器
NUMA 的主要優勢是伸縮性。NUMA 體系結構在設計上已超越了 SMP 體系結構在伸縮性上的限制。經過 SMP,全部的內存訪問都傳遞到相同的共享內存總線。這種方式很是適用於 CPU 數量相對較少的狀況,但不適用於具備幾十個甚至幾百個 CPU 的狀況,由於這些 CPU 會相互競爭對共享內存總線的訪問。NUMA 經過限制任何一條內存總線上的 CPU 數量並依靠高速互連來鏈接各個節點,從而緩解了這些瓶頸情況。架構
二、NUMA的幾種架構方案socket
NUMA 系統一般比一致內存訪問系統(UMA)更加經濟且性能更高。一致內存訪問系統必須平等地爲全部 CPU 提供內存,而 NUMA 系統則可以爲直接鏈接到 CPU 的內存提供高速互連,同時爲與 CPU 相隔較遠的內存提供較爲便宜但更高延遲的鏈接。ide
使用 NUMA 時,會常常遇到下面幾種方案,以SQL SERVER數據庫爲例。(參閱technet資料)性能
A. 沒有端口到 NUMA 的關聯優化
這是具備硬件 NUMA 和單個 SQL Server 實例的計算機中的默認設置。全部通訊流量都經過一個單獨的端口輸入並採用循環方式分佈到任何可用的 NUMA 節點。NUMA 增大了內存和 CPU 訪問的區域並增長了 I/O 和惰性編寫器線程的數量。在創建鏈接後會當即將其做用域限定爲此節點。它提供了 NUMA 節點間的自動負載平衡。客戶端應用程序能夠鏈接到單個端口,並且能夠輕鬆地進行部署。spa
將一個端口關聯到多個用於主要應用程序的硬件 NUMA 節點。將第二個端口關聯到另外一個用於第二個次要應用程序的硬件 NUMA 節點。用於這兩個應用程序的內存和 CPU 資源量很是不平衡,用於主要應用程序的本地內存和 CPU 資源量是用於次要應用程序的三倍。次要應用程序能夠是數據庫引擎的第二個實例,它在同一數據庫引擎實例中,甚至在同一數據庫中提供次要的功能。經過向優先使用的鏈接提供額外資源,它提供了一種線程優先執行的方式。
能夠將多個端口映射到同一 NUMA 節點。這樣,您就能夠爲不一樣的端口配置不一樣的權限。例如,您能夠經過控制對相應 TCP 端點的權限來嚴格限制由某個端口提供的訪問。在此示例中,端口 1450 在 Intranet 上廣泛可用。端口 1433 則設置爲經過防火牆鏈接到 Internet,並對它的訪問進行嚴格的限制。兩個端口均可以充分、平等、安全地利用 NUMA。
三、如何設置,遵循什麼原則
那麼在虛擬化場景中,如何設置NUMA呢?原則是什麼?
例如一臺配置了兩顆八核處理器以及128GB內存的服務器,咱們須要在其上分配CPU和內存資源並劃分虛機。
首先在NUMA架構中,每一個處理器可以控制64GB的物理內存,每一個處理器的八個核心中的每一個核心將對應一個8GB的NUMA節點。這將會如何影響虛擬機性能?因爲每一個處理器核心訪問NUMA節點內內存的速度要比其餘節點快,所以當虛擬機內存大小少於或者等於NUMA節點的內存大小時,虛擬機在理論上可以得到最好的性能。若是給虛擬機分配更多的內存,則虛擬機必然要訪問其NUMA節點以外的部份內存,這樣或多或少會影響其性能。若是應用可以感知NUMA,那就更好了。vSphere使用vNUMA能夠建立可以感知NUMA的虛擬機。該虛擬機將會被分割爲虛擬NUMA節點,每一個vNUMA節點將會被放置到一個不一樣的物理NUMA節點。儘管虛擬機仍舊在兩個NUMA節點之間擴展,但虛擬機內的操做系統和應用可以感知NUMA,資源使用將會獲得優化。
NUMA現已經對在數據中心服務器上安裝及選擇內存的方式帶來了不少改變。在給服務器增長物理內存時,咱們須要注意增長的內存要在NUMA節點之間進行平衡及匹配以使主板上的每一個處理器擁有相同的內存。若是在咱們所舉例的服務器上配置更多的內存,那麼必須在處理器之間平衡這些內存模塊。若是增長64GB的內存,那麼每一個處理器將分配到32GB的內存(每一個處理器可支配的內存將增長到96GB,服務器總內存數將達到192GB),每一個NUMA節點的內存大小將從8GB增長到12GB。因爲每一個Socket控制的內存插槽是不一樣的,所以要確保內存插槽是均勻的。例如192G內存分爲12個16G的內存條,那麼應該4個插在一個Socket的內存插槽中,另8個插在另兩個socket的內存插槽中。在爲虛機分配vCPU資源時,也儘量按照Socket/Core的倍數分配,好比1X1, 1X2, 1X 4, 1X8, 2X1, 2X2, 2X4, 2X8等組合,但不要使用2X3, 2X5, 2X7這種組合。後面的組合會引發跨Socket的內存調用,從而容易致使性能降低。
結合實踐,不一樣的業務對內存會有不一樣的要求,但最好不要跨NUMA單元去進行調用,儘量的使每一個CPU訪問它的直連內存單元。遵循這些簡單的原則,就會使性能更好。