揭秘OceanBase!它的OBProxy單機(jī)性能提升是如何實(shí)現(xiàn)的?
OBProxy產(chǎn)品從2014年開始設(shè)計(jì)研發(fā),至今已經(jīng)有近8年的歷史,其產(chǎn)品在螞蟻內(nèi)部、專有云場(chǎng)景、公有云場(chǎng)景都有廣泛的使用,在訪問鏈路上承擔(dān)了重要的作用。而為了實(shí)現(xiàn)OBProxy高性能特性,研發(fā)團(tuán)隊(duì)做了大量的工作,其中就包括OBproxy 單機(jī)性能優(yōu)化工作。
綜合來(lái)說(shuō),包括在OBProxy的功能設(shè)計(jì)和編碼實(shí)現(xiàn)時(shí)考慮性能影響,面向高性能編程,降低新功能帶來(lái)的性能損耗;關(guān)注新的硬件、linux內(nèi)核和編譯器技術(shù),使用新技術(shù)帶來(lái)性能優(yōu)化;以及建立性能回歸體系,對(duì)每個(gè)版本做嚴(yán)格性能回歸,保證性能優(yōu)化的成果。
接下來(lái),我們就來(lái)詳細(xì)展開看看。

OBProxy高性能設(shè)計(jì)
OBProxy在設(shè)計(jì)之初就考慮了高性能:
采用C++語(yǔ)言編寫,可以充分使用硬件、內(nèi)核的特性,也減少一些語(yǔ)言的GC等機(jī)制對(duì)性能影響;
設(shè)計(jì)優(yōu)秀的多線程模型,可以充分發(fā)揮每一個(gè)CPU核心的能力,架構(gòu)上做到盡量簡(jiǎn)單;
編碼時(shí)采用異步調(diào)用、內(nèi)存池、減少Buffer拷貝等手段優(yōu)化性能。
如果用一句話概括,OBProxy通過多線程和異步框架提供優(yōu)異的性能。不過為了滿足異步接口的使用,產(chǎn)品也做了一些犧牲,將一個(gè)完整的流程會(huì)被切割成多段代碼,對(duì)代碼可讀性有一定影響。
對(duì)于OBProxy的線程模型,下圖描述了公有云上OBProxy在16c機(jī)器上的任務(wù)分發(fā)模型。線程主要分為兩類:accept線程和work線程。accept有兩個(gè),work線程有16個(gè)(根據(jù)CPU核數(shù)確定)。work線程完全一樣,accept線程完成TCP建連后,會(huì)將對(duì)應(yīng)的套接字輪詢的發(fā)給每個(gè)work線程。每個(gè)work線程運(yùn)行epoll機(jī)制,進(jìn)行套接字的讀寫、異常等處理工作。

因此OBProxy可以做到CPU核心之間的負(fù)載均衡,充分發(fā)揮每一個(gè)核心的能力,不存在因?yàn)樽枞麑?dǎo)致CPU利用率上不去的情況。
OBProxy 優(yōu)化方向
雖然OBProxy有了優(yōu)秀的線程模型和異步框架,但隨著功能的不斷豐富,對(duì)性能也會(huì)產(chǎn)生一定的損耗。此時(shí)該如何提升性能?需要從應(yīng)用、編譯器和內(nèi)核、硬件三層去做性能優(yōu)化。
對(duì)于應(yīng)用層的優(yōu)化,常見做法分為四步:
1、確定優(yōu)化場(chǎng)景:如數(shù)據(jù)庫(kù)常選擇sysbench中的場(chǎng)景或者TPCC場(chǎng)景;
2、分析性能消耗:通過perf火焰圖、打日志等一些手段獲取性能消耗分布,從大到小,模塊、函數(shù)、代碼語(yǔ)句層層拆分下去,明確問題點(diǎn);
3、提出解決方案:無(wú)論是從設(shè)計(jì)上還是C++一些優(yōu)化技巧(如減少拷貝、減少鎖使用等)提出優(yōu)化方案;
4、驗(yàn)證優(yōu)化效果:根據(jù)方案進(jìn)行編碼,并重新驗(yàn)證優(yōu)化效果。
就大部分情況而言,應(yīng)用層優(yōu)化效果都很顯著。至于編譯器和內(nèi)核新特性使用,內(nèi)核和編譯器技術(shù)也在不斷發(fā)展,在性能方面也會(huì)提供越來(lái)越多的新特性,而這些技術(shù)發(fā)展并應(yīng)用到實(shí)踐中,都可以提升OBProxy性能。
硬件方面,主要是探索RDMA在 OceanBase 數(shù)據(jù)庫(kù)的使用。對(duì)于RDMA,除了大家知道的對(duì)延遲的影響,另一個(gè)重要作用就是Bypass Kernel,節(jié)約CPU,優(yōu)化性能。在分析OBProxy性能時(shí),可以發(fā)現(xiàn)內(nèi)核態(tài)進(jìn)行TCP報(bào)文收發(fā)就可能占用30%~ 50%的CPU資源。使用Bypass Kernel設(shè)計(jì)(參考下圖),可以進(jìn)一步提升OBProxy性能。

對(duì)于OBproxy項(xiàng)目,版本功能迭代是性能的一大殺手。新的功能特性意味著新代碼引入,代碼規(guī)模進(jìn)一步變大。除了指令數(shù)增加,對(duì)Cache命中率等硬件特性影響也會(huì)導(dǎo)致下降。因此需要平衡好新功能開發(fā)對(duì)性能影響:1、在性能設(shè)計(jì)時(shí)考慮性能影響,做評(píng)估好性能影響;2、建立完善的性能回歸體系,發(fā)現(xiàn)每一次的性能變化,并做好記錄。
而最后根據(jù)工程實(shí)踐,每個(gè)迭代性能損耗可以控制很好。
掃描二維碼推送至手機(jī)訪問。
版權(quán)聲明:本文由財(cái)神資訊-領(lǐng)先的體育資訊互動(dòng)媒體轉(zhuǎn)載發(fā)布,如需刪除請(qǐng)聯(lián)系。