當(dāng)一切正常時(shí),您通常不會(huì)擔(dān)心區(qū)塊鏈測試。我們將在下面解釋為什么最好不要擱置性能評估,使用什么度量標(biāo)準(zhǔn)并充分利用它才是最好的。就讓我們一探究竟吧。
“每秒交易數(shù)”( TPS)
在分布式系統(tǒng)中,TPS是一個(gè)非常模糊和反復(fù)無常的度量。
TPS測量來自分布式數(shù)據(jù)庫。它們通常使用標(biāo)準(zhǔn)化的交易類型或集合(例如,一些插入、更新、刪除以及常量選擇數(shù))來執(zhí)行,并針對特定的集群或單獨(dú)的機(jī)器進(jìn)行配置。這樣的“綜合”指標(biāo)并不能反映出所討論的數(shù)據(jù)庫或區(qū)塊鏈的實(shí)際性能,因?yàn)樵谶@樣的系統(tǒng)中,交易處理時(shí)間可能會(huì)有所不同。
面向共識(shí)性的數(shù)據(jù)庫(請參閱“CAP-theorem”)在從其他節(jié)點(diǎn)接收到足夠數(shù)量的確認(rèn)之前不會(huì)提交交易——這是很慢的。
面向可用性的數(shù)據(jù)庫時(shí),如果交易被簡單地寫入磁盤,那么它就是成功的。他們立即提供更新的數(shù)據(jù)——這是非常快的(盡管這個(gè)交易可能在將來回滾)。如果交易只更新一個(gè)數(shù)據(jù)單元,則TPS將更高。如果交易更新許多數(shù)據(jù)單元(行、索引、文件),它們將彼此阻塞。
這就是為什么我們在Oracle、MSSQL、PostgreSQL和MongoDB、Redis、Tarantool之間看不到任何“TPS競爭”的原因——它們的內(nèi)部機(jī)制和任務(wù)差別很大。
在我們看來,“測量區(qū)塊鏈TPS”是指進(jìn)行全面的性能測量:
a)在可重復(fù)的條件下
b)具有接近實(shí)際的塊驗(yàn)證器數(shù)量
c)使用不同類型的交易:
-研究區(qū)塊鏈的典型情況(例如,主要加密貨幣的transfer ())
-加載存儲(chǔ)子系統(tǒng)(每個(gè)交易都有相當(dāng)大的變化)
-加載網(wǎng)絡(luò)帶寬(大交易大?。?/p>
- cpu加載(大規(guī)模密碼轉(zhuǎn)換或計(jì)算)
要討論我們所珍視的“每秒交易數(shù)”,您需要描述所有網(wǎng)絡(luò)條件、參數(shù)和基準(zhǔn)測試邏輯。在區(qū)塊鏈中,將交易應(yīng)用到某個(gè)內(nèi)部數(shù)據(jù)庫并不意味著共識(shí)會(huì)接受它。
在PoW共識(shí)中,交易永遠(yuǎn)不會(huì)最終確定。如果一個(gè)交易包含在一臺(tái)機(jī)器上的一個(gè)塊中,這并不意味著它將被整個(gè)網(wǎng)絡(luò)接受(例如,另一個(gè)分叉獲勝的情況)。
如果區(qū)塊鏈有一個(gè)額外的算法來確保終結(jié)性(如EOS、Ethereum 2.0、Polkadot parachains使用與祖父終結(jié)性一共識(shí)的方式),那么處理時(shí)間可以視為節(jié)點(diǎn)看到交易和下一個(gè)完成塊的時(shí)間。這樣的TPS是非常有用的,但是因?yàn)樗鼈儽阮A(yù)期的要低,所以很少見。
TPS涉及到很多東西。保持懷疑,詢問細(xì)節(jié)。
Blockchain-specific指標(biāo)
本地TPS
處理交易的數(shù)量和最大/平均/分鐘處理時(shí)間(在本地節(jié)點(diǎn)上)是非常方便測量的,因?yàn)閳?zhí)行這些操作的函數(shù)通常用代碼表示。交易處理時(shí)間等于更新狀態(tài)數(shù)據(jù)庫所需的時(shí)間。例如,在“樂觀”區(qū)塊鏈中,已處理的交易可能已經(jīng)經(jīng)過驗(yàn)證,但還沒有被一致接受。在這種情況下,節(jié)點(diǎn)將更新后的數(shù)據(jù)發(fā)送到客戶機(jī)(假設(shè)不會(huì)有任何鏈分叉。
這個(gè)度量不是很可靠:如果選擇另一個(gè)鏈分支作為主分支,那么關(guān)于交易的統(tǒng)計(jì)數(shù)據(jù)也必須回滾。在測試中,這一點(diǎn)常常被忽略。
“我們的區(qū)塊鏈昨天收到了8000個(gè)tps”。這些數(shù)字通??梢栽诤喍痰捻?xiàng)目報(bào)告中找到,因?yàn)樗鼈兒苋菀诇y量。只需一個(gè)運(yùn)行節(jié)點(diǎn)和一個(gè)加載腳本就足夠了。在這種情況下,沒有網(wǎng)絡(luò)延遲會(huì)降低達(dá)成網(wǎng)絡(luò)共識(shí)的速度。
該指標(biāo)反映了狀態(tài)數(shù)據(jù)庫在不受網(wǎng)絡(luò)影響的情況下的性能。這個(gè)數(shù)字并沒有反映真實(shí)的網(wǎng)絡(luò)帶寬,但是顯示了如果共識(shí)和網(wǎng)絡(luò)足夠快,它將努力達(dá)到的極限。任何區(qū)塊鏈交易的結(jié)果都是多個(gè)原子存儲(chǔ)寫。例如,一個(gè)比特幣支付交易涉及刪除幾個(gè)舊的UTXOs(刪除)和添加新的UTXOs(插入)。在以太坊中,執(zhí)行一個(gè)小型智能合約代碼并更新幾個(gè)鍵-值對。
原子存儲(chǔ)寫是發(fā)現(xiàn)存儲(chǔ)子系統(tǒng)瓶頸和區(qū)分低級邏輯問題和內(nèi)部邏輯問題的優(yōu)秀指標(biāo)。
區(qū)塊鏈節(jié)點(diǎn)可以用幾種編程語言實(shí)現(xiàn)——這更可靠。例如,以太坊節(jié)點(diǎn)有Rust和Go實(shí)現(xiàn)。在測試網(wǎng)絡(luò)性能時(shí)請記住這一點(diǎn)。
本地生產(chǎn)的區(qū)塊數(shù)量
這個(gè)簡單的指標(biāo)顯示了某個(gè)驗(yàn)證器生成的塊的數(shù)量。它依賴于共識(shí),并且對于評估單個(gè)驗(yàn)證者網(wǎng)絡(luò)的“有用性”至關(guān)重要。
因?yàn)轵?yàn)證器在每個(gè)塊上都能賺錢,所以它們負(fù)責(zé)機(jī)器的穩(wěn)定運(yùn)行和安全。您可以確定哪個(gè)驗(yàn)證器候選是最合格的、受保護(hù)的,并且準(zhǔn)備好在具有真實(shí)用戶資產(chǎn)的公共網(wǎng)絡(luò)中工作。公制值可以公開檢查—只需下載區(qū)塊鏈并計(jì)算塊的數(shù)量。
最后結(jié)尾и不可逆轉(zhuǎn)的塊
終局性確保在區(qū)塊鏈中包含的所有交易都不會(huì)回滾,也不會(huì)被另一個(gè)鏈分叉替換。這是PoS網(wǎng)絡(luò)防止雙重消費(fèi)攻擊和為用戶確認(rèn)加密貨幣交易的一種方式。
當(dāng)有一個(gè)塊完成包含該交易的鏈時(shí),而不是當(dāng)某個(gè)交易被節(jié)點(diǎn)接受時(shí),用戶認(rèn)為該交易是最后塊。要完成一個(gè)塊,驗(yàn)證器必須在p2p網(wǎng)絡(luò)中接收這個(gè)塊并相互交換簽名。這里檢查區(qū)塊鏈的實(shí)際速度,因?yàn)榻灰淄瓿傻臅r(shí)刻對用戶來說是最重要的。
終結(jié)性算法也不同,它會(huì)相交并結(jié)合主要共識(shí)(閱讀:Casper在Ethereum,最后不可逆塊在EOS,外公在奇偶Polkadot和他們的修改,例如,MixBytes RANDPA)。
對于沒有完成所有塊的網(wǎng)絡(luò),一個(gè)有用的度量是在最后完成的塊和當(dāng)前最新的塊之間的延遲。這個(gè)數(shù)字顯示了驗(yàn)證器落后了多少,這與正確的鏈一致。如果差距很大,那么最終性算法需要額外的分析和優(yōu)化。
P2P層
點(diǎn)對點(diǎn)子系統(tǒng)——區(qū)塊鏈網(wǎng)絡(luò)的中間層——經(jīng)常被忽略。這都要?dú)w咎于塊交付和驗(yàn)證器之間交易的模糊延遲。
當(dāng)確認(rèn)器的數(shù)量很少的時(shí)候,它們是本地化的,對等列表是硬編碼的,一切都工作得很好而且很快。但是,就像驗(yàn)證器存在一樣,節(jié)點(diǎn)在地理上是分布的,丟失的數(shù)據(jù)是模擬的,我們正面臨嚴(yán)重的“tps”故障。
例如,當(dāng)使用附加的終結(jié)性算法測試EOS共識(shí)性時(shí),將驗(yàn)證器的數(shù)量增加到80-100臺(tái),分布在四大洲,對終結(jié)性幾乎沒有影響。與此同時(shí),增加的包丟失嚴(yán)重影響了最終結(jié)果,這證明了需要額外的p2p層配置來更好地抵抗網(wǎng)絡(luò)包丟失(而不是高延遲)。不幸的是,有許多不同的設(shè)置和因素,只有基準(zhǔn)測試允許我們了解所需的驗(yàn)證器數(shù)量,并獲得相當(dāng)舒適的區(qū)塊鏈速度。
p2p子系統(tǒng)的配置從文檔中很清楚,例如,看看[libp2p]、[Kademlia]協(xié)議或[BitTorrent]。
重要的p2p指標(biāo)可以是:
· 進(jìn)出流量
· 與其他對等點(diǎn)的成功/不成功連接的數(shù)量
· 返回先前緩存的數(shù)據(jù)塊的次數(shù),以及為了找到所需的數(shù)據(jù)塊需要進(jìn)一步轉(zhuǎn)發(fā)請求的次數(shù)(緩存命中/丟失模擬數(shù)據(jù))
例如,在訪問數(shù)據(jù)時(shí),較大的遺漏數(shù)意味著只有少數(shù)節(jié)點(diǎn)擁有請求的數(shù)據(jù),而它們沒有時(shí)間將這些數(shù)據(jù)分發(fā)給每個(gè)節(jié)點(diǎn)。接收/發(fā)送的p2p通信量允許識(shí)別處理網(wǎng)絡(luò)配置或通道問題的節(jié)點(diǎn)。
區(qū)塊鏈節(jié)點(diǎn)的系統(tǒng)度量
區(qū)塊鏈節(jié)點(diǎn)的標(biāo)準(zhǔn)系統(tǒng)度量在大量的源代碼中都有描述,因此我們將簡要介紹。它們有助于發(fā)現(xiàn)邏輯瓶頸和錯(cuò)誤。
中央處理器
CPU顯示處理器執(zhí)行的計(jì)算量。如果CPU負(fù)載高——節(jié)點(diǎn)正在計(jì)算一些東西,積極使用邏輯或FPU(幾乎從未在區(qū)塊鏈中使用)。例如,后一種情況會(huì)發(fā)生,因?yàn)楣?jié)點(diǎn)正在檢查電子簽名、使用強(qiáng)密碼處理事務(wù)或進(jìn)行復(fù)雜的計(jì)算。
CPU可以被劃分成更多指向代碼瓶頸的指標(biāo)。例如,系統(tǒng)時(shí)間—花在內(nèi)核代碼上的時(shí)間,用戶時(shí)間—花在用戶進(jìn)程上的時(shí)間,io—等待來自慢速外部設(shè)備(磁盤/網(wǎng)絡(luò))的i/o,等等。
內(nèi)存
現(xiàn)代區(qū)塊鏈?zhǔn)褂面I值數(shù)據(jù)庫(LevelDB、RocksDB),這些數(shù)據(jù)庫不斷地在其內(nèi)存中存儲(chǔ)“熱”數(shù)據(jù)。任何加載的服務(wù)都會(huì)受到由錯(cuò)誤或針對節(jié)點(diǎn)代碼的攻擊所導(dǎo)致的內(nèi)存泄漏的影響。如果內(nèi)存消耗正在增加或急劇增加,很可能是由于大量的狀態(tài)數(shù)據(jù)庫鍵、大型交易隊(duì)列或不同節(jié)點(diǎn)子系統(tǒng)之間的消息量增加造成的。
內(nèi)存負(fù)載不足表明可能會(huì)增加塊數(shù)據(jù)限制或最大化交易復(fù)雜性。
響應(yīng)網(wǎng)絡(luò)客戶機(jī)的完整節(jié)點(diǎn)依賴于文件緩存指標(biāo)。當(dāng)客戶機(jī)訪問狀態(tài)數(shù)據(jù)庫和交易日志的各個(gè)部分時(shí),可能會(huì)出現(xiàn)磁盤中的舊塊并替換新塊。這反過來又降低了客戶機(jī)的響應(yīng)速度。
網(wǎng)絡(luò)
主要的網(wǎng)絡(luò)指標(biāo)是流量的大?。ㄒ宰止?jié)為單位)、發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)包的數(shù)量、丟包率。這些指標(biāo)經(jīng)常被低估,因?yàn)閰^(qū)塊鏈還不能以每秒1 Gbit的速度處理交易。
目前,一些區(qū)塊鏈項(xiàng)目允許用戶共享WiFi或提供存儲(chǔ)和發(fā)送文件或消息的服務(wù)。在測試這樣的網(wǎng)絡(luò)時(shí),網(wǎng)絡(luò)接口流量的數(shù)量和質(zhì)量變得非常重要,因?yàn)橐粋€(gè)擁擠的網(wǎng)絡(luò)通道會(huì)影響機(jī)器上的所有其他服務(wù)。
存儲(chǔ)
磁盤子系統(tǒng)是所有服務(wù)中最慢的組件,常常會(huì)導(dǎo)致嚴(yán)重的性能問題。過多的日志記錄、意外的備份、不方便的讀/寫模式、大量的區(qū)塊鏈卷——所有這些都可能導(dǎo)致顯著的節(jié)點(diǎn)減速或過多的硬件需求。
使用磁盤的區(qū)塊鏈交易日志操作模式類似于使用寫前日志(WAL)的不同DBMS。從技術(shù)上講,交易日志可以被看作是狀態(tài)數(shù)據(jù)庫的WAL。
因此,這些存儲(chǔ)指標(biāo)非常重要,因?yàn)樗鼈兛梢源_定現(xiàn)代鍵值數(shù)據(jù)庫中的瓶頸。讀取/寫入IOPS數(shù)、最大/最小/avg延遲以及許多其他有助于優(yōu)化磁盤操作的指標(biāo)。
結(jié)論
綜上所述,我們可以將度量分為:
· 區(qū)塊鏈節(jié)點(diǎn)度量(產(chǎn)生的塊的數(shù)量、處理的事務(wù)的數(shù)量、處理時(shí)間、完成時(shí)間等)
· p2p子系統(tǒng)指標(biāo)(命中/丟失請求的數(shù)量、活動(dòng)對等點(diǎn)的數(shù)量、p2p流量的數(shù)量和結(jié)構(gòu)等)
· 系統(tǒng)節(jié)點(diǎn)指標(biāo)(cpu、內(nèi)存、存儲(chǔ)、網(wǎng)絡(luò)等)
每個(gè)組都很重要,因?yàn)橐坏┳酉到y(tǒng)錯(cuò)誤,就會(huì)限制其他組件的操作。即使是少量驗(yàn)證器的減速也會(huì)嚴(yán)重影響整個(gè)網(wǎng)絡(luò)。
在共識(shí)性和終結(jié)性算法中,最棘手的錯(cuò)誤只出現(xiàn)在大型交易流或共識(shí)性參數(shù)更改時(shí)。他們的分析需要可重復(fù)的測試條件和復(fù)雜的負(fù)載場景。
責(zé)任編輯;zl
評論
查看更多