如何提升區(qū)塊鏈系統(tǒng)性能是很多開(kāi)發(fā)者都會(huì)關(guān)注的事,但是有些對(duì)區(qū)塊鏈并非十分熟悉的開(kāi)發(fā)者可能會(huì)感到?jīng)]有頭緒。長(zhǎng)安鏈提供了性能分析工具幫助開(kāi)發(fā)者梳理系統(tǒng)耗時(shí),優(yōu)化系統(tǒng)性能。下面對(duì)長(zhǎng)安鏈性能分析工具原理及使用進(jìn)行介紹。
一、 概述
time_counter.sh是長(zhǎng)安鏈性能分析工具,可用于分析TBFT共識(shí)下,一輪完整共識(shí)過(guò)程中各個(gè)階段的耗時(shí)情況,幫助用戶(hù)了解底鏈性能。采用此性能分析工具,需要確保txpool、core、consensus、storage模塊開(kāi)啟INFO級(jí)別的日志。
二、一輪共識(shí)過(guò)程
圖 1 一輪共識(shí)流程圖
1、整體流程
整體共識(shí)流程如上圖所示,主要分為四個(gè)階段,分別是Proposal, Prevote, Precommit, Commit,下面分別從共識(shí)主從節(jié)點(diǎn)視角介紹四個(gè)階段的流程。
○?Proposal階段:開(kāi)始新一輪共識(shí)時(shí),會(huì)選舉出新的主節(jié)點(diǎn),主節(jié)點(diǎn)的共識(shí)模塊consensus會(huì)通知核心引擎模塊core構(gòu)造區(qū)塊,共識(shí)模塊收到新的區(qū)塊后,將會(huì)構(gòu)造提案并廣播給其他的從節(jié)點(diǎn),自己則進(jìn)入到prevote階段并廣播prevote投票。
○?Proposal階段:從節(jié)點(diǎn)的共識(shí)模塊consensus收到主節(jié)點(diǎn)廣播的提案后,將會(huì)通知自身的核心引擎模塊core驗(yàn)證并執(zhí)行區(qū)塊,區(qū)塊有效則進(jìn)入到prevote階段并廣播自己的prevote投票。
○?Prevote階段:主節(jié)點(diǎn)和從節(jié)點(diǎn)在prevote階段收到2f+1張prevote投票后,將會(huì)進(jìn)入到precommit階段。
○?Precommit階段:主節(jié)點(diǎn)和從節(jié)點(diǎn)進(jìn)入到precommit階段后,會(huì)構(gòu)造并廣播自己的到precommit投票,并將此時(shí)的共識(shí)狀態(tài)寫(xiě)入wal中,確保重啟時(shí)恢復(fù)到最新的共識(shí)狀態(tài),在收到2f+1張precommit投票后,將會(huì)進(jìn)入到commit階段。
○?Commit階段:主節(jié)點(diǎn)和從節(jié)點(diǎn)進(jìn)入到commit階段后,會(huì)通知自身的核心引擎模塊core提交區(qū)塊,core調(diào)用存儲(chǔ)模塊將區(qū)塊寫(xiě)入數(shù)據(jù)庫(kù),并通知共識(shí)模塊進(jìn)入下一高度區(qū)塊的共識(shí)流程。
2、具體操作
此部分細(xì)化了上述整體流程中各個(gè)階段的具體操作,性能分析工具會(huì)根據(jù)關(guān)鍵日志檢索出各具體操作的耗時(shí)情況。
(1)主節(jié)點(diǎn)core模塊構(gòu)造區(qū)塊和執(zhí)行交易GenBlock
○ fetch: 交易池檢索一批交易用于構(gòu)造區(qū)塊;
○ prune:交易池調(diào)用存儲(chǔ)模塊進(jìn)行增量防重;
○ cache:在區(qū)塊剪裁模式下,交易池會(huì)緩存fetch的交易,以便從節(jié)點(diǎn)缺失這些交易時(shí),可向主節(jié)點(diǎn)請(qǐng)求。
○ filter:布谷鳥(niǎo)對(duì)txId進(jìn)行格式和時(shí)間校驗(yàn);
○ begin DB transaction:采用sql存儲(chǔ)時(shí),開(kāi)啟一個(gè)事務(wù);
○ new snapshot:執(zhí)行交易前,創(chuàng)建snapshot,作為這個(gè)區(qū)塊執(zhí)行時(shí)的快照;
○ vm:交易并行調(diào)度執(zhí)行和DAG構(gòu)建;
○ finalize block: 計(jì)算區(qū)塊頭中交易默克爾樹(shù)根、讀寫(xiě)集樹(shù)根、DAG樹(shù)根;
(2)主節(jié)點(diǎn)consensus模塊構(gòu)造提案GenProposal
○ signBlock: 計(jì)算區(qū)塊哈希值和對(duì)區(qū)塊簽名;
○ signProposal: 對(duì)提案進(jìn)行簽名;
(3)從節(jié)點(diǎn)consensus模塊驗(yàn)證提案ProcProposal
○ verify:驗(yàn)證主節(jié)點(diǎn)身份和驗(yàn)證提案簽名;
(4)從節(jié)點(diǎn)core模塊驗(yàn)證區(qū)塊和執(zhí)行交易VerifyBlock
○ blockSign: 驗(yàn)證區(qū)塊簽名;
○ vm: 按DAG順序執(zhí)行交易;
○ txVerify:core模塊從交易池取出區(qū)塊中交易和驗(yàn)證交易(對(duì)于區(qū)塊中在交易池的交易只需比對(duì)交易哈希是否一致;對(duì)于區(qū)塊中不在交易池中的交易會(huì)進(jìn)行交易格式、權(quán)限、時(shí)間戳及防重檢查);
○ txRoot:計(jì)算并校驗(yàn)三顆樹(shù)根是否有效;
○ pool:區(qū)塊剪裁模式下,對(duì)區(qū)塊進(jìn)行恢復(fù);
○ consensusCheckUsed: 對(duì)于同步過(guò)來(lái)的區(qū)塊,驗(yàn)證區(qū)塊中QC是否有效;
(5)從節(jié)點(diǎn)Prevote階段
○?從節(jié)點(diǎn)prevote階段主要操作包括構(gòu)造自身的prevote投票并對(duì)收到的2f+1張prevote投票進(jìn)行驗(yàn)簽,及投票的網(wǎng)絡(luò)廣播
(6)主從節(jié)點(diǎn)Precommit階段
○?主從節(jié)點(diǎn)precommit階段主要操作包括構(gòu)造自身的precommit投票并對(duì)收到的2f+1張precommit投票進(jìn)行驗(yàn)簽,及投票的網(wǎng)絡(luò)廣播;
○?共識(shí)狀態(tài)寫(xiě)入wal文件:marshalData和marshalEntry為序列化共識(shí)狀態(tài)操作,saveWal為將序列化結(jié)果寫(xiě)入wal文件;
(7)主從節(jié)點(diǎn)提交區(qū)塊CommitBlock
○ check: core模塊驗(yàn)證區(qū)塊高度和區(qū)塊前置哈希是否合法;
○ marshal:DB模塊對(duì)區(qū)塊和交易讀寫(xiě)集進(jìn)行序列化;
○ writeFile:DB模塊序列化結(jié)果寫(xiě)入wal文件;
○ writeCache:DB模塊對(duì)區(qū)塊信息寫(xiě)緩存;
○ writeBatchChan:DB模塊將區(qū)塊信息放入順序?qū)慶hannel;(快速寫(xiě)模式)
○ writeKvDB:DB模塊將區(qū)塊信息寫(xiě)入數(shù)據(jù)庫(kù);(普通寫(xiě)模式)
○ ss:清除snapshot;
○ conf:如果是配置交易則進(jìn)行配置變更;
○ pool:交易池刪除該區(qū)塊中的交易并將旁枝區(qū)塊中的交易重新放回交易池;
○ pubConEvent:對(duì)區(qū)塊中交易事件進(jìn)行通知;
○ filter:將區(qū)塊中交易加入到布谷鳥(niǎo)過(guò)濾器;
○? other:添加監(jiān)控記錄;
(8)其他操作
○?主要是模塊間通過(guò)msgbus交互的操作、主節(jié)點(diǎn)廣播proposal到從節(jié)點(diǎn)接受proposal間的網(wǎng)絡(luò)傳遞等過(guò)程;
○?還有部分操作,底鏈關(guān)鍵日志中并未進(jìn)行記錄;
三、 使用說(shuō)明及分析
1、使用說(shuō)明
(1)??從官網(wǎng)下載性能分析工具,并賦予可執(zhí)行權(quán)限;
(2)??將各個(gè)共識(shí)節(jié)點(diǎn)包含想要分析的區(qū)塊高度范圍的日志拷貝到性能分析工具所在目錄下,并將對(duì)應(yīng)節(jié)點(diǎn)的日志命名為system.log.1, system.log.2, system.log.3,system.log.4等;
(3)??運(yùn)行腳本工具,傳入共識(shí)節(jié)點(diǎn)數(shù)目,起始區(qū)塊高度,結(jié)束區(qū)塊高度;
使用示例:?
./time_counter_2.3.1.sh 4 100 110
2、分析結(jié)果
圖 2 各階段各具體操作耗時(shí)分析結(jié)果
一輪共識(shí)流程整體耗時(shí):?
core_commit_interval = (1)主節(jié)點(diǎn)core模塊GenBlock時(shí)間 + (2)主節(jié)點(diǎn)consensus模塊GenProposal時(shí)間 + (3)從節(jié)點(diǎn)consensus模塊ProcProposal時(shí)間 + (4)從節(jié)點(diǎn)core模塊VerifyBlock時(shí)間 + (5)從節(jié)點(diǎn)prevote階段耗時(shí) + (6)主從節(jié)點(diǎn)precommit階段耗時(shí) + (7)主從節(jié)點(diǎn)core模塊CommitBlock時(shí)間 + (8) 其他操作時(shí)間
重疊時(shí)間說(shuō)明:?
○ txpool_total 是主節(jié)點(diǎn)交易池中fetch、prune、cache三部分時(shí)間的加和;
○ core_gen_fetch 即交易池txpool_total的時(shí)間,core模塊也進(jìn)行了記錄;
○ core_gen_total 是主節(jié)點(diǎn)core模塊構(gòu)造區(qū)塊的整體時(shí)間;
○ consensus_total 是主節(jié)點(diǎn)consensus模塊對(duì)區(qū)塊簽名和構(gòu)造提案的時(shí)間;
○ consensus_proposal 是主節(jié)點(diǎn)proposal階段整體耗時(shí),包括了core模塊構(gòu)造區(qū)塊和consensus模塊構(gòu)造提案的時(shí)間;
○ core_verify_total 是從節(jié)點(diǎn)core模塊驗(yàn)證區(qū)塊和執(zhí)行交易的總時(shí)間;
○ storage_total 是存儲(chǔ)寫(xiě)區(qū)塊和讀寫(xiě)集等信息的總時(shí)間;
○ core_commit_db 即存儲(chǔ)模塊storage_total的時(shí)間,core模塊也進(jìn)行了記錄;
○ core_commit_total 是core模塊提交區(qū)塊的總時(shí)間;
○ core_commit_interval 是此區(qū)塊的一輪共識(shí)總時(shí)間;文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-542815.html
文檔鏈接:https://docs.chainmaker.org.cn/v2.3.1/html/dev/性能分析工具.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-542815.html
到了這里,關(guān)于輔助性能優(yōu)化——長(zhǎng)安鏈性能分析工具原理及用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!