最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

StoneDB 源碼解讀系列|Tianmu 引擎工具類模塊源碼詳解(一)

2023-07-26 11:33 作者:StoneDB  | 我要投稿


StoneDB 源碼解讀系列文章正式開啟,預(yù)計(jì)以周更的形式跟大家見面,請(qǐng)多多支持~

各個(gè)工具類屬于 Tianmu 引擎的核心組件,這些組件可以說是 Tianmu 的基石,由于工具類的范圍廣,在源碼解讀系列中會(huì)挑選主要的一些跟大家做分享,包括:日志系統(tǒng)、異常處理、堆棧跟蹤、線程池、內(nèi)存管理、數(shù)據(jù)壓縮/解壓縮等。本篇內(nèi)容主要分享前面四點(diǎn)。

源碼結(jié)構(gòu)

眾所周知大型項(xiàng)目會(huì)有巨量的代碼,為了方便管理和維護(hù),一般開發(fā)人員會(huì)根據(jù)功能模塊對(duì)源代碼劃分為不同的目錄,所以在分析大型項(xiàng)目時(shí)首先要知道項(xiàng)目中每個(gè)目錄的作用是干什么的,然后再根據(jù)自己的需求去對(duì)應(yīng)的目錄解讀對(duì)應(yīng)的代碼。

1.?StoneDB 源碼目錄結(jié)構(gòu)

2. Tianmu 引擎的源碼目錄結(jié)構(gòu)

Tianmu 引擎的日志系統(tǒng)

Tianmu 引擎的日志類型分為了三類,系統(tǒng)日志、調(diào)試日志、和查詢引擎執(zhí)行的結(jié)果日志。其中系統(tǒng)的異常信息、異常情況的堆棧信息 和一些計(jì)時(shí)信息都記錄在系統(tǒng)日志里面。系統(tǒng)運(yùn)維和開發(fā)人員可以通過日志了解服務(wù)器軟硬件信息、檢查配置過程中的錯(cuò)誤及錯(cuò)誤發(fā)生的原因。經(jīng)常分析日志可以了解服務(wù)器的負(fù)荷,性能安全性,從而及時(shí)采取措施糾正錯(cuò)誤。

下圖為 Tianmu 引擎的日志系統(tǒng)結(jié)構(gòu)關(guān)系圖:

1.?日志系統(tǒng)

系統(tǒng)日志把日志分為了以下 7 個(gè)級(jí)別 :

使用枚舉類型表示各個(gè)級(jí)別


并支持將MySQL日志級(jí)別映射到Tianmu日志級(jí)別,可以通過 設(shè)置參數(shù) tianmu_global_debug_level 來控制日志的輸出級(jí)別:

日志的級(jí)別越高輸出的信息就越多,當(dāng)然詳細(xì)的日志信息會(huì)影響系統(tǒng)的運(yùn)行性能,需要視情況而定。

Tianmu 的系統(tǒng)日志會(huì)統(tǒng)一落地到 MySQL 安裝目錄下/log/tianmu.log文件

日志系統(tǒng)核心類:


2. 調(diào)試日志

調(diào)試日志落地到mysql安裝目錄下/log/trace.log文件。

由?tianmu_control_trace 該配置項(xiàng)控制,為1打開記錄日志的開關(guān),為0則關(guān)閉

調(diào)用接口對(duì)象:


3.?查詢引擎執(zhí)行的結(jié)果日志

查詢引擎執(zhí)行的結(jié)果日志落地到 StoneDB 安裝目錄下/log/ query.log文件。

由?tianmu_ini_controlquerylog 該配置項(xiàng)控制,為1打開記錄日志的開關(guān),為0則關(guān)閉

調(diào)用接口對(duì)象:



堆棧跟蹤

保存堆棧的相關(guān)信息(堆棧的函數(shù)調(diào)用和堆棧的符號(hào)信息等),方便后續(xù)調(diào)試和問題排查,目前 Tianmu 系統(tǒng)基于異常處理模塊加上了堆棧信息的記錄,如果有異常情況出現(xiàn),就會(huì)把現(xiàn)場(chǎng)的堆棧信息記錄下來。堆棧的調(diào)用信息會(huì)以 WARN 級(jí)別的日志信息記錄在 Tianmu 的系統(tǒng)日志里面,日志所在的目錄:StoneDB 安裝目錄下/log/tianmu.log文件中。

其中為了獲得堆棧信息,Tianmu 這里使用了?glibc中提供的backtrace()和backtrace_symbols()?兩個(gè)函數(shù)來輸出和解析程序的 call stack,并使用 g++ 中的 abi::__cxa_demangle 來 demangle(將C++ ABI標(biāo)識(shí)符(C++ ABI identifier)轉(zhuǎn)換成C++源程序標(biāo)識(shí)符(original C++ source identifier)的過程稱為demangle。更簡(jiǎn)單的說,識(shí)別C++編譯以后的函數(shù)名的過程,就叫demangle。)

調(diào)用函數(shù)接口:


異常處理

Tianmu支持的異常處理類型如下圖:

異常處理的流程圖如下:

出現(xiàn)異常后Tianmu 系統(tǒng)會(huì)把異常信息,和出現(xiàn)異常邏輯的堆棧調(diào)用信息以WARN級(jí)別的日志信息記錄在Tianmu的系統(tǒng)日志里面,日志所在的目錄:StoneDB安裝目錄下/log/tianmu.log文件中。

異常處理模塊核心基類:


線程池

Tianmu 的線程是基于 C++ 新特性實(shí)現(xiàn)的

線程池核心類:



其具有以下優(yōu)點(diǎn):

  • Tianmu 的線程池的實(shí)現(xiàn)是基于 C++11 標(biāo)準(zhǔn)的線程庫(kù):std::thread??蛇M(jìn)行跨平臺(tái)編譯而無(wú)需修改代碼。

  • 使用 std::condition_variable 和 std::mutex ?進(jìn)行線程的阻塞控制和喚醒,避免線程無(wú)效的循環(huán)和等待,提高程序效率。

  • 對(duì)添加線程的入口使用了函數(shù)模板與可變長(zhǎng)參數(shù)模板,使之可添加任意的處理流程進(jìn)入到線程池中。

  • 其中 Tianmu 引擎支持利用 std::thread::hardware_concurrency() 函數(shù)或者機(jī)器的 CPU 核心數(shù),自動(dòng)的對(duì)不同線程池利用不同的分配策略來設(shè)置線程池中的線程數(shù)量,可以自動(dòng)精準(zhǔn)的配置和利用機(jī)器的 CPU,避免造成CPU 資源利用不足和線程分配過多導(dǎo)致系統(tǒng)資源內(nèi)耗的情況。同時(shí)用戶也可根據(jù)機(jī)器的資源情況進(jìn)行配置。

1.線程池類型

目前Tianmu引擎基于此線程池類定義了以下四類線程池

  • 延遲插入線程池

主要功能是將 insert buffer 中的數(shù)據(jù)加載到數(shù)據(jù)庫(kù)



  • 加載導(dǎo)入線程池

主要功能是把插入和導(dǎo)入的數(shù)據(jù)落地到磁盤



  • 查詢處理線程池

為查詢過程中提供并行處理的能力


  • delete & update 執(zhí)行線程池

為 delete 和update 執(zhí)行接口提供并行執(zhí)行的功能


各類線程池和其中加入的線程執(zhí)行體如下圖所示:

2.線程池初始化流程

線程池初始化的過程是在 StoneDB 系統(tǒng)啟動(dòng)的過程中進(jìn)行的初始化,主要是為各類線程池初始化實(shí)例對(duì)象,設(shè)置各類線程池的類型,和線程池的大小。

下圖為線程初始化過程 StoneDB 系統(tǒng)調(diào)用的流程:

以上是本文全部?jī)?nèi)容。


StoneDB 源碼解讀系列|Tianmu 引擎工具類模塊源碼詳解(一)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
蓬溪县| 广东省| 乐至县| 阿荣旗| 巍山| 定兴县| 高密市| 新田县| 千阳县| 麦盖提县| 临汾市| 新沂市| 舟山市| 平度市| 邹城市| 台前县| 隆昌县| 庆元县| 大余县| 南昌市| 大庆市| 西城区| 顺平县| 阿克陶县| 绥江县| 大渡口区| 夏津县| 东海县| 河东区| 樟树市| 左云县| 志丹县| 许昌市| 永福县| 闽清县| 庄浪县| 景德镇市| 多伦县| 城步| 徐闻县| 土默特右旗|