numa節點 簡單聊聊資料庫與NUMA

2021-10-12 06:16:51 字數 2508 閱讀 3284

早期的計算機系統一直處於硬體資源匱乏的階段,cpu,記憶體都是十分稀缺的資源,因此在發展smp架構的系統的時候,早期都是使用uma(統一記憶體架構)的架構的,所有的cpu訪問記憶體的時候都是通過北橋的匯流排控制器統一訪問記憶體。

記憶體上的資料通過匯流排可以以相同的延時傳輸給任何一顆cpu。在只有一兩顆cpu,幾百m記憶體的伺服器上,這一切都不是問題。不過隨著計算機技術的發展,伺服器上的cpu越來越多,記憶體也越來越多,匯流排無法支撐這種uma架構了。於是numa出現了。

在numa架構下,cpu被分為多個node,記憶體也被劃分到不同的node,於是本地記憶體,本地共享記憶體,遠端記憶體等概念就出現了(不同的廠商在實現numa上有不同,記憶體的劃分也會有所不同)。從圖上我們也可以看出,如果cpu1要訪問memory 0,那麼是無法直接訪問的,需要通過cpu0來訪問。這種遠端訪問的速度肯定是比本地訪問要低的多的。我們來看看乙個實際的案例。這是老白的一台伺服器,intel e8 兩路伺服器,每顆cpu有18核。

從上面的資料我們可以看到,這個伺服器上有兩個node 0/1,node distances就是node上記憶體訪問的距離,距離越遠訪問效能越差,這個指標是線性的,我們可以看到,0-0/1-1的訪問距離是10,0-1/10的訪問距離是21,也就是說遠端訪問的延時是本地訪問的2.1倍。另外乙個我們可以看到的是,這台伺服器有64g記憶體,每個node分配了32g,不過node 0的free記憶體已經使用的差不多了,而node 1才分配了不到一半。從這裡我們可以看出,numa對於記憶體的分配不是均勻的,或者說numa架構可能會導致記憶體分配在node之間的不均衡。在沒有仔細研究numa之前,老白作為乙個dba,遵從官方文件,盡可能在作業系統層和資料庫層關閉numa,認為只要關閉了numa,就可以萬事大吉了。直到真正認真的研究了numa,才發現以前的認知是錯誤的。在os層和rdbms層關閉numa,只是避免了一些rdbms的bug,實際上並沒有本質上解決numa的問題。因此numa是乙個物理的存在,並不能在軟體層面上去解決它。最主要的問題就是我們在上面所看到的兩個問題,乙個是遠端記憶體訪問效能,乙個是節點間的記憶體分配不均衡。第乙個問題比較清晰,我們就不做深入的討論了,對於記憶體分配不均衡的問題。這是怎麼產生的呢?實際上對於numa架構,作業系統已經做了一定的優化,比如當我們的某個執行緒在cpu上執行時,os總是盡可能的分配local記憶體給這個執行緒,從而確保其訪問的效能。如果某個numa node上的記憶體不足的時候,那麼就要盡可能的將部分本節點上的記憶體swap了,然後騰出記憶體給需要在本節點分配記憶體的其他執行緒使用。這就導致了我們看到物理記憶體還有很多的free,但是swap的使用率也很高了。這種swap就會導致部分應用的效能下降。這也是我們可以在一台1路或者2路伺服器上很輕鬆的把cpu使用率壓得很高,但是在一台8路伺服器上,我們再怎麼優化也很難把cpu壓滿的乙個原因。對於普通的大量的可均勻分配的主要訪問本地記憶體的應用,比如web訪問,numa架構還是能夠很好的發揮其效果的。而對於資料庫這樣的大量使用大規模共享記憶體的應用來說,就不可避免在執行過程中去訪問遠端記憶體了。

這是oracle 的乙個後台程序的numa map,可以看到很多記憶體是在多個node上分配的,而且分配還十分不均衡。mysql也是類似的:

mysql的innodb buffer如果設定的比較大,那麼不可避免的需要在多個node上分配,訪問這些buffer的效能也會因為本地記憶體與遠端記憶體的不同而存在差異。

說實在的,numa的這些問題對於絕大多數的系統來說帶來的問題不明顯,或者說我們的應用可以承受numa帶來的缺點,對於有些極端的現象,我們可以通過調整記憶體分配的策略來調整numa的標準行為。最為重要的引數是vm.zone_reclaim_mode。oracle官方的建議是在大多數環境中,將這個引數設定為6,也就是禁止本地節點分配遠端記憶體。這種做法似乎也不是萬能的,一旦真的物理記憶體出現嚴重不足,那麼swap風險也是不小的。不過在一些mysql社群裡,主流的意見是將這個引數設定為0,也就是關閉這個功能,當本地無法分配記憶體時,首先分配遠端記憶體,而不要做swap。實際上,從numa的基本原理上來看,這種做法也的作用也是正負各半,並不會有十分明顯的效果。

numa大大加大了多路伺服器的效能優化的複雜性。還好,一般情況下我們還比較窮,8路甚至32路伺服器還不是我們的主流配置。因此對於oracle資料庫來說,我們還可以用兩台4路組成的rac來替代一台昂貴的8路伺服器。當然rac的cache fusion帶來的開銷和numa帶來的負面作用哪個更大並無定論,這個和應用場景關係極大。不過記住一點,8路甚至8路以上的伺服器來跑oracle資料庫,你的錢不一定花對地方了,一台40萬的伺服器可能不如兩台8萬的伺服器能做的更好。

NUMA 架構與資料庫效能

在這次的 oracle open world 上,hammerora 的作者 steve shaw 做了乙個關於 linux 平台 oracle 調優的演講,其中重點提到了 numa 架構對於 intel nehalem cpu 上跑 oracle 的效能影響。對於傳統 smp 來說,cpu 增多未...

資料庫簡單備份與恢復

在執行輸入cmd 在cmd下輸入exp windone wind orclwind file f data.dmp log f logimp.log owner windone 即可完成資料備份 windone是使用者名稱 wind是密碼 orclwind是資料庫名 owner windone 這個...

簡單使用資料庫資料庫

查詢 注釋 查詢公式 select 欄位名字1 別名,欄位名字2 as 別名.from 表名 執行順序 from select確定結果集 查詢dept表中的所有資訊 select from dept 查詢雇員表中所有員工的員工編號,員工姓名,上級編號 要查詢的資料 empno,ename,mgr 條...