GaussDB(DWS)通信庫(kù)libpq重構(gòu)介紹(一)

      網(wǎng)友投稿 844 2025-03-31

      通信庫(kù)libpq重構(gòu)解決兩點(diǎn)問(wèn)題:


      針對(duì)大并發(fā)短查詢場(chǎng)景下,CN與DN建立/復(fù)用/歸還/釋放連接時(shí)爭(zhēng)搶全局鎖PoolerLock,造成的性能問(wèn)題進(jìn)行Pooler鎖優(yōu)化;

      針對(duì)當(dāng)前代碼倉(cāng)中l(wèi)ibpq代碼冗余度高、復(fù)用性差、可維護(hù)性差、可讀性差問(wèn)題,對(duì)libpq代碼進(jìn)行整合以符合clean code要求。

      在現(xiàn)網(wǎng)多個(gè)局點(diǎn),在高并發(fā)短查詢場(chǎng)景下,CN與DN建連時(shí)等待PoolerLock鎖耗時(shí),導(dǎo)致環(huán)境CPU資源無(wú)法進(jìn)一步使用,嚴(yán)重影響此場(chǎng)景下查詢性能。Poller鎖優(yōu)化旨在高并發(fā)短查詢場(chǎng)景下優(yōu)化CN與DN建連性能,pooler建連不再制約環(huán)境CPU資源使用,全面提升高并發(fā)短查詢性能。

      libpq代碼合并旨在提高libpq代碼的復(fù)用性、可讀性、可維護(hù)性,符合clean code要求。

      一、pooler鎖優(yōu)化

      Pooler連接總體分兩大類:一類空閑連接,存儲(chǔ)在某個(gè)DBPool的NodePool中;一類是使用中的連接,存儲(chǔ)在每個(gè)線程獨(dú)立的poolAgent數(shù)據(jù)結(jié)構(gòu)中,因?yàn)楸闅v需求,所有線程的poolAgent指針又存儲(chǔ)在全局的poolAgents數(shù)組中。

      Pooler鎖優(yōu)化總體方案是使用無(wú)鎖ringbuffer存儲(chǔ)空閑連接和可用的agent index,實(shí)現(xiàn)并發(fā)空閑連接的存取不需加鎖,并發(fā)agent index的存取不需加鎖。

      針對(duì)全局的DBPool鏈表和NodePool Hash表,僅在新增時(shí)加互斥鎖,正常查找時(shí)加共享鎖。

      針對(duì)CleanConnection、pg_pooler_status、pv_total_memory_detail、pgxc_pool_reload、pg_pool_validate需遍歷NodePool中所有空閑連接的場(chǎng)景,使用ringbuffer的pop接口將連接取到本線程,操作完后再push回ringbuffer,實(shí)現(xiàn)無(wú)鎖遍歷。

      針對(duì)以上視圖接口需遍歷poolAgents數(shù)組中所有正在使用連接的場(chǎng)景,在Agents數(shù)組中增加status標(biāo)志位,做短暫的讀保護(hù)。

      二、libpq代碼合并

      libpq代碼從功能角度可以劃分為3部分:

      基礎(chǔ)公共模塊

      通信建連、斷連

      應(yīng)用層定義的通信協(xié)議

      除去通信協(xié)議部分,基礎(chǔ)公共模塊、通信建連及斷連模塊的代碼實(shí)現(xiàn)大體相同,完全可以合并成1份,以動(dòng)態(tài)庫(kù)的形式提供給其他模塊使用,對(duì)外只提供必要的通信建連、斷連等接口,隱藏內(nèi)部具體實(shí)現(xiàn)。

      首先梳理并確定3個(gè)模塊公用的建連、斷連流程,如圖 3?1、圖 3?2所示。在此基礎(chǔ)上,確定建連、斷連流程的內(nèi)部接口與外部接口、使用的數(shù)據(jù)結(jié)構(gòu),外部接口聲明、結(jié)構(gòu)體前置聲明位于libpq-fe.h頭文件中,內(nèi)部接口聲明、結(jié)構(gòu)體定義位于libpq-int.h頭文件中。其他模塊使用libpq時(shí),只需要libpq-fe.h頭文件與libpq.so,不需要關(guān)注libpq內(nèi)部實(shí)現(xiàn)。

      GaussDB(DWS)通信庫(kù)libpq重構(gòu)介紹(一)

      合并過(guò)程中,對(duì)于相似的代碼,提煉出公共函數(shù),提高代碼的復(fù)用性、可讀性;對(duì)于差異較大的代碼,采用注冊(cè)回調(diào)函數(shù)的方式(startupPacket構(gòu)建、result成員內(nèi)存釋放),保留差異邏輯。

      合并完成后,3個(gè)模塊各自目錄下的冗余代碼或者冗余文件都被刪除。合并以后的代碼實(shí)現(xiàn)存放在interfaces/libpq目錄下,頭文件存放在include/libpq目錄下。

      圖 2?1 公用建連流程

      圖 2?2 公用斷連流程

      圖 2?3 libpq合并文件結(jié)構(gòu)

      libpq重構(gòu)的詳細(xì)設(shè)計(jì),將在后面具體介紹。

      想了解GuassDB(DWS)更多信息,歡迎微信搜索“GaussDB DWS”關(guān)注微信公眾號(hào),和您分享最新最全的PB級(jí)數(shù)倉(cāng)黑科技,后臺(tái)還可獲取眾多學(xué)習(xí)資料~

      EI企業(yè)智能 Gauss AP 數(shù)據(jù)倉(cāng)庫(kù)服務(wù) GaussDB(DWS) 數(shù)據(jù)通信

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:如何檢查工作簿中是否存在工作表?
      下一篇:如何通過(guò)制造業(yè)客戶關(guān)系管理實(shí)現(xiàn)高效客戶管理?客戶關(guān)系管理在制造業(yè)中的具體應(yīng)用
      相關(guān)文章
      亚洲国产精品综合久久久| 国产亚洲精品美女久久久| 老色鬼久久亚洲AV综合| 亚洲AV永久精品爱情岛论坛| 国产精品亚洲产品一区二区三区 | 中文字幕乱码亚洲精品一区| 亚洲乱码中文论理电影| 亚洲一区电影在线观看| 亚洲国产中文在线二区三区免| 亚洲区视频在线观看| 亚洲AV综合色区无码二区偷拍| 亚洲jjzzjjzz在线播放| 国产成人亚洲综合一区| 亚洲午夜成人精品无码色欲| 亚洲欧美aⅴ在线资源| 久久综合亚洲色hezyo| 五月天婷亚洲天综合网精品偷| 国产精品亚洲一区二区三区久久 | 婷婷亚洲综合五月天小说在线| 亚洲AV无码乱码在线观看性色扶| 亚洲A丁香五香天堂网| 亚洲色偷拍区另类无码专区| 亚洲中文字幕无码久久精品1 | 亚洲小视频在线观看| 亚洲美女色在线欧洲美女| 亚洲第一网站免费视频| 亚洲伊人精品综合在合线| 日韩亚洲不卡在线视频中文字幕在线观看| 亚洲国产亚洲片在线观看播放| 狠狠色伊人亚洲综合网站色| 亚洲精品天堂无码中文字幕| 无码不卡亚洲成?人片| 日韩精品亚洲aⅴ在线影院| 国产AV无码专区亚洲A∨毛片| 亚洲人成在线观看| 亚洲乱码一区av春药高潮| 亚洲成a∧人片在线观看无码| 亚洲精品色婷婷在线影院| 国产精一品亚洲二区在线播放| 亚洲无删减国产精品一区| 激情综合亚洲色婷婷五月 |