openGauss鯤鵬多核優(yōu)化解讀
從集成電路誕生到現(xiàn)在,CPU主要經(jīng)歷了三個發(fā)展階段,第一階段是提升CPU的主頻。在集成電路問世6年后,摩爾就提出了摩爾定律,預言了芯片上集成的晶體管數(shù)量將每兩年翻一番。摩爾定律不是自然定律,但半導體芯片發(fā)展的事實證明,摩爾的預言是準確的。芯片的技術進步主要受益于兩個方面:制程變小和硅片變大。但當芯片工藝規(guī)格小于7nm的時候,就會出現(xiàn)量子隧穿效應,芯片量產(chǎn)變得困難,導致制造成本急劇上升。
第二階段是增加核數(shù),在單核CPU頻率無法繼續(xù)增加的情況下,可以通過增加CPU的核數(shù)來提升算力。但CPU只是邏輯計算單元,必須把內(nèi)存中的程序和數(shù)據(jù)加載到CPU中才能進行計算。所有CPU核都是通過共享一個北橋來讀取內(nèi)存,隨著核數(shù)的快速發(fā)展,北橋在響應時間上的性能瓶頸越來越明顯。
第三階段是CPU核NUMA化,為了解決北橋中讀取內(nèi)存的部分即內(nèi)存控制器的瓶頸,可以把內(nèi)存平均分配在各個die上,但這導致了不同CPU核訪問不同內(nèi)存時延的非對稱性。原因是雖然內(nèi)存直接attach在CPU上,但當CPU訪問自身直接attach內(nèi)存對應的物理地址時(即Local Access),響應時間較短。如果訪問其他CPU attach的內(nèi)存數(shù)據(jù)(即Remote Access),就需要通過inter-connect通道訪問,響應時間就會變慢。這也是NUMA(Non-Uniform Memory Access)名稱的由來。在NUMA架構下,NUMA Node的處理器和內(nèi)存塊的物理距離被稱為NUMA距離,通過numactl工具可以查詢到CPU訪問的距離信息。以鯤鵬服務器為例,圖示如下:
從集成電路誕生到現(xiàn)在,CPU主要經(jīng)歷了三個發(fā)展階段,第一階段是提升CPU的主頻。在集成電路問世6年后,摩爾就提出了摩爾定律,預言了芯片上集成的晶體管數(shù)量將每兩年翻一番。摩爾定律不是自然定律,但半導體芯片發(fā)展的事實證明,摩爾的預言是準確的。芯片的技術進步主要受益于兩個方面:制程變小和硅片變大。但當芯片工藝規(guī)格小于7nm的時候,就會出現(xiàn)量子隧穿效應,芯片量產(chǎn)變得困難,導致制造成本急劇上升。
第二階段是增加核數(shù),在單核CPU頻率無法繼續(xù)增加的情況下,可以通過增加CPU的核數(shù)來提升算力。但CPU只是邏輯計算單元,必須把內(nèi)存中的程序和數(shù)據(jù)加載到CPU中才能進行計算。所有CPU核都是通過共享一個北橋來讀取內(nèi)存,隨著核數(shù)的快速發(fā)展,北橋在響應時間上的性能瓶頸越來越明顯。
第三階段是CPU核NUMA化,為了解決北橋中讀取內(nèi)存的部分即內(nèi)存控制器的瓶頸,可以把內(nèi)存平均分配在各個die上,但這導致了不同CPU核訪問不同內(nèi)存時延的非對稱性。原因是雖然內(nèi)存直接attach在CPU上,但當CPU訪問自身直接attach內(nèi)存對應的物理地址時(即Local Access),響應時間較短。如果訪問其他CPU attach的內(nèi)存數(shù)據(jù)(即Remote Access),就需要通過inter-connect通道訪問,響應時間就會變慢。這也是NUMA(Non-Uniform Memory Access)名稱的由來。在NUMA架構下,NUMA Node的處理器和內(nèi)存塊的物理距離被稱為NUMA距離,通過numactl工具可以查詢到CPU訪問的距離信息。以鯤鵬服務器為例,圖示如下:
CPU NUMA化給服務器帶來澎湃算力的同時,也給軟件開發(fā)帶來了很大挑戰(zhàn)。從整個IT軟件棧來看,首先需要對NUMA化進行支持的是操作系統(tǒng),現(xiàn)在通用的企業(yè)操作系統(tǒng)是Linux操作系統(tǒng)。在NUMA出現(xiàn)后,Linux也提供了針對性的優(yōu)化方案,優(yōu)先嘗試在請求線程當前所處的CPU的Local內(nèi)存上分配空間。如果local內(nèi)存不足,優(yōu)先淘汰local內(nèi)存中無用的Page。但Linux提供的NUMA內(nèi)存使用方式并不適合數(shù)據(jù)庫,因為數(shù)據(jù)庫是一個數(shù)據(jù)密集型高并發(fā)的應用,內(nèi)部有很多的內(nèi)核數(shù)據(jù)結(jié)構,這些數(shù)據(jù)結(jié)構既會被本核的CPU訪問,也會被遠程的CPU核訪問。為了提高數(shù)據(jù)訪問性能,數(shù)據(jù)庫還有自己的共享數(shù)據(jù)緩沖區(qū),這些共享緩沖區(qū)是隨機的被各個CPU核上的業(yè)務線程訪問。從IT軟件棧來看,數(shù)據(jù)庫是處于企業(yè)應用的核心位置,很多應用后臺都有一個數(shù)據(jù)庫,數(shù)據(jù)庫的性能決定了很多應用的整體吞吐量。因此如果數(shù)據(jù)庫無法在NUMA下發(fā)揮最大性能,實現(xiàn)隨著核數(shù)的增加,性能呈現(xiàn)一定的線性比,那么CPU NUMA雖然算力很豐富,但可能沒有企業(yè)愿意買單。
反過來,NUMA作為CPU發(fā)展的一種必然趨勢,一款企業(yè)級的數(shù)據(jù)庫如果不能適應硬件的發(fā)展,在企業(yè)的數(shù)據(jù)庫選型中,這款數(shù)據(jù)庫也將被淘汰出局。
openGauss作為一款開源關系型數(shù)據(jù)庫管理系統(tǒng),針對CPU NUMA 化的硬件發(fā)展趨勢,從并發(fā)控制算法,內(nèi)核數(shù)據(jù)結(jié)構,數(shù)據(jù)訪問等全方位進行了優(yōu)化,釋放處理器多核算力,實現(xiàn)兩路鯤鵬128核場景150萬tpmC性能。本文深度解讀openGauss在鯤鵬服務器上的NUMA多核優(yōu)化技術,同時也為其他數(shù)據(jù)庫在鯤鵬上進行性能優(yōu)化提供借鑒和參考。
openGauss鯤鵬多核優(yōu)化解讀
數(shù)據(jù)庫是高并發(fā),數(shù)據(jù)訪問沖突嚴重的軟件系統(tǒng)。數(shù)據(jù)庫領域圖靈獎獲得者Stonebraker等人于2014年在VLDB發(fā)表的論文:Staring into the abyss: an evaluation of concurrency control with one thousand cores。這個論文觀點表明傳統(tǒng)數(shù)據(jù)庫的事務處理機制無法有效利用數(shù)十到上百個核的處理能力。通過對數(shù)據(jù)庫進行更深入的分析,發(fā)現(xiàn)這里面既有并發(fā)控制算法的原因,也有實現(xiàn)機制的原因。數(shù)據(jù)庫為了實現(xiàn)并發(fā),內(nèi)部使用了很多鎖,比如openGauss中的Clog、WALInsert、WALWrite、ProcArray、XidGen等。這些鎖是性能瓶頸點,而鎖的本質(zhì)是保護內(nèi)核數(shù)據(jù)結(jié)構。所以openGauss需要對這些數(shù)據(jù)結(jié)構進行調(diào)整和優(yōu)化,來應對鯤鵬NUMA架構下多核的并發(fā)問題。主要目的有三個:實現(xiàn)CPU的就近訪問,去除單點瓶頸,共享數(shù)據(jù)的內(nèi)存均勻分配和訪問。
1.1 線程綁核,避免線程在核間偏移
為了實現(xiàn)CPU核的就近訪問,首先需要把線程固定到具體的核上。openGauss有一個GUC配置參數(shù)numa_distribute_mode控制CPU綁核分配。通過這個參數(shù),可以把業(yè)務處理線程綁定到具體NUMA NODE上。openGauss是一個客戶端服務器結(jié)構,客戶端和服務器通過網(wǎng)絡通信來進行交互,網(wǎng)絡是一個頻繁的操作,為了避免網(wǎng)絡中斷和業(yè)務處理相互干擾,也需要進行網(wǎng)絡中斷綁核,同時需要考慮網(wǎng)絡中斷綁核和后臺業(yè)務線程綁核區(qū)分開。
1.2 NUMA化數(shù)據(jù)結(jié)構改造,減少跨核訪問
WALInsertLock用來對WAL Insert操作進行并發(fā)保護,可以配置多個,如16。訪問行為主要有兩種:1)Xlog Insert 時分配一個Insert Lock;2)遍歷訪問所有WALInsertLock,比如查找是否存在空洞信息,用于XLogFlush等。
在原來的實現(xiàn)方案中,所有的WALInsertLock都在同一個全局數(shù)組,存放在共享內(nèi)存中。WALInsertLock競爭激烈,大概率會涉及到遠端訪存,即多個線程會進行跨Node、跨P競爭。而實際上Insert Lock有多個實例,大部分操作每次僅需申請一個Insert Lock,可以考慮將申請操作限制在相同的NUMA Node內(nèi)部。
優(yōu)化后的方案將全局WALInsertLock數(shù)組按照NUMA Node的數(shù)目分為多份,分別在對應NUMA Node上申請內(nèi)存。每個事務線程根據(jù)自己所歸屬的NUMA Node,選擇WALInsertLocks子數(shù)組。WALInsertLock引用了共享內(nèi)存中的LWLock,為了最大化減少跨Node競爭,將LWLock直接嵌入到WALInsertLock內(nèi)部,這樣就可以一起進行NUMA分布,同時還減少了一次Cache Line訪問。
1.3 數(shù)據(jù)分區(qū),減少線程訪問沖突
CLOG日志即事務提交日志,用來記錄事務的最終狀態(tài),是XLOG日志的輔助,用來加速通過日志判斷事務狀態(tài)的過程,存在四種事務狀態(tài),即:IN_PROGRESS、COMMITED、ABORTED、SUB_COMMITED,每條日志占2 bit,CLOG需要存儲在磁盤上,一個頁面(8k)可包含215條,每個日志文件(段=2048x8k)226條,而日志ID位32位,因此可能存在256個clog文件,CLOG文件在 PGDATA/pg_clog 目錄下,為了加速對磁盤文件的訪問,對CLOG的訪問是通過緩沖池實現(xiàn)的,代碼中使用統(tǒng)一的SLRU緩沖池。
優(yōu)化前CLOG的日志緩沖池在共享內(nèi)存中且全局唯一,名稱為“CLOG Ctl”,各工作線程使用由線程局部變量ClogCtl來指向該資源,在高并發(fā)的場景下,該資源的競爭成為性能瓶頸。優(yōu)化后按照PageNo將日志均分到多個共享內(nèi)存的緩沖池中,由線程局部對象的數(shù)組 ClogCtlData來記錄,名稱為“CLOG Ctl i”,同步增加共享內(nèi)存中的緩沖池對象及對應的全局鎖。
類似的,對內(nèi)部其他的共享關鍵數(shù)據(jù)結(jié)構也都進行了數(shù)據(jù)分區(qū)。
1.4 并發(fā)控制算法調(diào)整,減少單點瓶頸
優(yōu)化前事務啟動獲取事務快照,需要獲取ProcArrayLock。事務結(jié)束清理事務狀態(tài)快照時,需要獲取ProcArrayLock。并發(fā)連接增大時導致全局事務管理器上獲取的快照變大。
優(yōu)化后使用事務提交快照,每個非只讀事務在運行過程中會取得一個XID,在事務提交時會推進CSN,同時會將當前CSN與事務的XID映射關系保存起來。棕色豎線表示取snapshot時刻,如果不使用CSN方案,那么棕色豎線對應snapshot的集合應該是{2,4,6}。如果采用CSN方案,會獲取當前的CSN值,也就是3,事務TX2、TX4、TX6、TX7、TX8的CSN分別為4、6、5、7、8,對于該snapshot而言,這幾個事務的修改都不可見。
1.5 借助ARM原子指令,減少計算開銷
傳統(tǒng)編譯器的原子操作默認采用ll/sc原子指令,任何核要獲取共享變量的寫權限,必須先 “排他性”的獲取共享全部變量的ownership,即把“最新數(shù)據(jù)”先Load到本核所在的L1 Cache中,才能進行修改操作,在多CPU的情況下,會由于激烈的競爭導致系統(tǒng)性能下降。
在ARMv8.1引入了一種新的原子操作LSE,將計算操作放到存儲端去做,從而提升計算性能。理論上在多核系統(tǒng)下,LSE的性能優(yōu)于ll/sc, 實測在6.4.0中使用LSE的性能在高并發(fā)下是ll/sc的3~5倍。
openGauss鯤鵬多核優(yōu)化結(jié)果
數(shù)據(jù)庫系統(tǒng)運行會涉及多種資源,包括CPU,內(nèi)存,網(wǎng)絡IO,磁盤IO。性能優(yōu)化的極致就是各個資源占用恰好都達到瓶頸點。但在實際調(diào)優(yōu)時,環(huán)境可能是由各種硬件組成的,所以調(diào)優(yōu)的目標偏重會有不同,但充分發(fā)揮CPU的能力是一個系統(tǒng)調(diào)優(yōu)的基本目標。經(jīng)過針對NUMA架構優(yōu)化后,openGauss基于鯤鵬920,TPCC測試性能達到150W tpmC,CPU運行效率接近95%,這些實際實驗數(shù)據(jù)表明,openGauss充分發(fā)揮了CPU的多核算力。
openGauss開源社區(qū)官方網(wǎng)站:https://opengauss.org
openGauss組織倉庫:https://gitee.com/opengauss
openGauss鏡像倉庫:https://github.com/opengauss-mirror
云數(shù)據(jù)庫 GaussDB(for openGauss) 鯤鵬
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。