說到伺服器的numa架構,大家或許都知道。numa架構在中大型系統上一直非常盛行,也是高效能的解決方案,尤其在系統延遲方面表現都很優秀。但numa架構對伺服器的相關效能到底有什麼影響,怎樣設定會更好呢?本文在此解析一下。
1、什麼是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 數量並依靠高速互連來連線各個節點,從而緩解了這些瓶頸狀況。
2、numa的幾種架構方案
numa 系統通常比一致記憶體訪問系統(uma)更加經濟且效能更高。一致記憶體訪問系統必須平等地為所有 cpu 提供記憶體,而 numa 系統則能夠為直接連線到 cpu 的記憶體提供高速互連,同時為與 cpu 相隔較遠的記憶體提供較為便宜但更高延遲的連線。
使用 numa 時,會經常遇到下面幾種方案,以sql server資料庫為例。(參閱technet資料)
a. 沒有埠到 numa 的關聯
這是具有硬體 numa 和單個 sql server 例項的計算機中的預設設定。所有通訊流量都通過乙個單獨的埠輸入並採用迴圈方式分布到任何可用的 numa 節點。numa 增大了記憶體和 cpu 訪問的區域並增加了 i/o 和惰性編寫器執行緒的數量。在建立連線後會立即將其作用域限定為此節點。它提供了 numa 節點間的自動負載平衡。客戶端應用程式可以連線到單個埠,而且可以輕鬆地進行部署。
將乙個埠關聯到多個用於主要應用程式的硬體 numa 節點。將第二個埠關聯到另乙個用於第二個次要應用程式的硬體 numa 節點。用於這兩個應用程式的記憶體和 cpu 資源量非常不平衡,用於主要應用程式的本地記憶體和 cpu 資源量是用於次要應用程式的三倍。次要應用程式可以是資料庫引擎的第二個例項,它在同一資料庫引擎例項中,甚至在同一資料庫中提供次要的功能。通過向優先使用的連線提供額外資源,它提供了一種執行緒優先執行的方式。
可以將多個埠對映到同一 numa 節點。這樣,您就可以為不同的埠配置不同的許可權。例如,您可以通過控制對相應 tcp 端點的許可權來嚴格限制由某個埠提供的訪問。在此示例中,埠 1450 在 intranet 上普遍可用。埠 1433 則設定為通過防火牆連線到 internet,並對它的訪問進行嚴格的限制。兩個埠都可以充分、平等、安全地利用 numa。
3、如何設定,遵循什麼原則
那麼在虛擬化場景中,如何設定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訪問它的直連記憶體單元。遵循這些簡單的原則,就會使效能更好。
NUMA 架構與資料庫效能
在這次的 oracle open world 上,hammerora 的作者 steve shaw 做了乙個關於 linux 平台 oracle 調優的演講,其中重點提到了 numa 架構對於 intel nehalem cpu 上跑 oracle 的效能影響。對於傳統 smp 來說,cpu 增多未...
Tegra X1效能解析
摘要 它是乙個名副其實的效能怪獸 雖然它的圖形效能是ipad air 2上搭載的a8x晶元的兩倍,但是耗費的電量卻相差不多。tegra x1強勁的效能表明,未來市面上平板電腦的遊戲效能將越來越接近台式電腦。tegra x1採用的是英偉達最新的maxwell架構,和該公司目前最新的geforce gt...
Redis 多核CPU與NUMA架構優化
當今的cpu一般會有多顆核心 我們稱為物理核心 每顆核心都有自己的一級快取 簡稱l1 cache 與二級快取 簡稱l2 cache 這兩集快取都比較小,一般都是kb級別,cpu核心訪問它們一般只有幾納秒,非常快。一級快取又可以進一步分為指令快取與資料快取。但是一級快取與二級快取都比較小,可以儲存的指...