01.17 PerTether:通過故障注入對以太坊私有鏈進行性能測試

PerTether:通過故障注入對以太坊私有鏈進行性能測試

南京大學智能軟件工程實驗室

iselab.cn

摘要

我們介紹PerTether,這是一種基於故障注入以太坊私有鏈性能測試工具。PerTether可以幫助以太坊開發人員和用戶測試以太坊的性能並通過故障注入發現潛在的bug。我們提出了兩個影響以太坊性能的因素和四種可能影響穩定性的故障。因此,我們在PerTether中實現了區塊鏈部署,性能測試和故障注入。 測試任務完成後,將以圖表形式提供測試結果。 實驗結果表明:(1)PerTether可以測量兩個區塊鏈指定的性能指標(即吞吐量和延遲); (2)實驗結果可以證明這兩個因素和故障注入對性能的影響。

關鍵詞

以太坊私有鏈,性能測試,故障注入

介紹

區塊鏈作為第一種可行的去中心化技術,近年來備受關注。它為實施智能合約提供了必要的可信環境。通過支持圖靈完備的智能合約編程語言,以太坊已成為一個完善的區塊鏈平臺。性能瓶頸是公共以太坊區塊鏈的主要問題並且難以突破。但是,用戶可以使用以太坊客戶端方便地構建自己的私有區塊鏈和去中心化應用程序。像其他區塊鏈平臺一樣,以太坊依靠關鍵但耗時的共識流程來確保交易數據的一致性,這在中心化信用機構中通常不予考慮。區塊共識需要大量的計算和通信資源。因此,在實際應用中,應仔細考慮私有以太坊的性能並進行系統測試。但是,作為不可更改且受信任的分佈式系統,區塊鏈始終部署在不安全且不穩定的環境中,這可能會導致不可預測的故障。因此,區塊鏈的穩定性也是一個值得注意的地方。

Dinh研究了對常規私有區塊鏈進行性能測試的方法。他們關注的是諸如無信任環境中的共識和智能合約執行等區塊鏈功能對特定於區塊鏈的性能指標(例如吞吐量和延遲)的影響。我們認真研究了他們的工作,並對以太坊私有鏈進行更深入的研究。具體來說,通過分析以太坊的共識協議和Gas機制,我們認識到可以影響以太坊性能的兩個因素(即difficulty和gas limit)。

但是,僅性能測試是不夠的。性能測試始終在沒有外界干擾的測試環境中執行。分佈式系統總是面臨不可預測的故障,這可能導致性能下降甚至整個系統崩潰。作為一種分佈式系統,區塊鏈遇到故障的可能性更大,這不僅是因為複雜的共識協議,而且還因為不穩定的部署環境。因此,如果以太坊開發人員或用戶想要獲得更接近真實場景的測試結果,則他們必須在性能測試中模擬可能的故障。因此,我們提出了可能在區塊鏈中發生的四種故障,並實現了PerTether,這是一種用於測試以太坊私有鏈的性能和穩定性的工具。對於以太坊區塊鏈,PerTether根據配置實現自動部署,故障注入和測試任務執行。測試報告包括吞吐量和延遲(以秒為單位)。此外,故障注入的影響將顯示在報告中。

性能影響因素

在本節中,我們分析了可能影響性能的以太坊特徵。我們關注以太坊的PoW共識協議和Gas機制,並提出兩個性能因素,Difficulty和Gas limit。在以太坊中,智能合約被編譯為EVM字節碼,執行每個字節碼會消耗典型但固定數量的Gas。交易完成後,EVM將計算出此交易的總耗氣量。每筆交易都會設定一個特定的汽油價格。交易手續費將從交易發送方的帳戶餘額中扣除,並最終支付給礦工。Gas消耗通常不被認為是性能指標。但是,Gas機制與塊大小有關,這間接影響了事務延遲。以太坊實現了PoW共識協議。以太坊礦工執行名為Ethash的算法以達成共識,這需要大量的計算能力和內存來挖掘新區塊。之後,所有對等方都應驗證新開採的區塊。 PoW協議需要花費大量時間和資源才能達成共識。因此,以太坊的交易處理能力受到限制,從而導致性能瓶頸。

影響因素

通過分析以太坊的上述特徵,我們提出了兩個性能因素。 這些因素只能在以太坊私有鏈的部署中進行配置。

Difficulty。Difficulty越高,附加塊所需的計算能力和間隔時間就越長。 事實證明,塊生成間隔會影響性能。 較長的時間間隔意味著發送事務請求後需要更多的確認時間,這會導致延遲增加。

Gas limit。Gas limit表示每個塊可以容納的最大Gas量,這會影響塊的大小。 每個區塊打包的所有交易消耗的天然氣總和不能超過天然氣限額。 這限制了每個塊中可以包含的事務數量。 由於需要一段時間才能添加區塊,因此此因素可能會影響以太坊私有鏈的性能。

性能指標

關於區塊鏈,以下兩個指標(吞吐量和延遲)通常用於性能度量。

吞吐量。每秒返回的成功事務數。 吞吐量可以直觀地反映區塊鏈的交易處理能力。

延遲。從事務開始到確認的時間間隔。 平均延遲反映了以太坊的交易處理能力。

以太坊中的故障

在本節中,我們考慮了私人以太坊區塊鏈中可能發生的故障。因此,我們分析了傳統分佈式系統上的故障。研究人員發現,分佈式系統不可能一直保持穩定。多種故障可能會影響穩定性和性能。 Netflix的工程師在2016年提出了一個名為“混沌工程”的概念,該概念致力於模擬分佈式系統中的實際故障。儘管可以將區塊鏈視為分佈式系統,但仍然存在許多差異。例如,區塊鏈中沒有主從結構,所有對等點都處於同一級別;每個節點都擁有整個區塊鏈數據,而不是其中一部分。區塊鏈中沒有負載平衡算法的實現。所有交易都在所有對等節點上執行。結合區塊鏈和分佈式系統之間的共性和差異,我們基於分佈式系統中的已知故障來分析區塊鏈中的故障。根據區塊鏈的四個抽象層,我們從四個角度總結了故障,包括應用,共識,智能合約和網絡層。

應用

在這一層中,我們從宏觀角度考慮以太坊私有鏈。在以太坊區塊鏈中,Dapp是一種基於智能合約的Web應用程序。當用戶執行某些交易操作時,Dapp會將交易發送到智能合約。因此,如果多個用戶同時訪問Dapp,則區塊鏈將滿足較高的交易負載。 2017年,一個名為CryptoKitties的Dapp幾乎摧毀了公共以太坊區塊鏈,由於高請求率而有近20000筆交易被阻塞。因此,我們總結了一個稱為流量峰值的故障。出現流量高峰時,請求速率會突然快速增漲。

共識

在傳統的分佈式系統中,總是有一個集中節點來控制其他節點。但是,區塊鏈中的節點不會遵循單個主節點,而是遵循共識協議。因此,不會出現單點故障。但是,這意味著每個節點在以太坊私有鏈中扮演著更重要的角色。與傳統的分佈式系統中的節點不同,區塊鏈中的每個節點都包含整個區塊鏈數據並執行所有交易。另外,以太坊的共識協議是PoW。該協議需要大量的計算能力,這在私有區塊鏈中是有限的。如果礦工節點發生故障,則塊生成能力可能會降低。因此,我們在共識層提出節點故障。

智能合約

以太坊支持智能合約,該合約允許用戶在區塊鏈上部署和執行其代碼。儘管有針對智能合約的有效測試套件,但它們的質量仍然無法控制。未優化的智能合約包含許多不必要的或不安全的字節碼,這些字節碼可能會影響性能並消耗更多汽油。由於區塊鏈中的所有節點都將執行代碼,因此影響將被放大。 Dinh指出,智能合約可能會影響區塊鏈的性能。因此,未充分優化的智能合約可被視為故障。

網絡

與區塊鏈不同,傳統的分佈式系統總是部署在穩定的環境中,例如局域網。安全性和不變性是區塊鏈的兩個關鍵特徵。在大多數情況下,區塊鏈技術用於不穩定的環境中,在這種環境中,區塊鏈必須面對網絡故障。有時,節點部署在不同的物理區域中,這增加了網絡故障的可能性。高延遲和丟包將影響節點之間的通信。由於分散,節點通信比常規的分佈式系統更多,這擴大了網絡故障的影響。因此,我們在網絡層中提出高延遲和丟包。

工具介紹

用戶場景

PerTether是一種基於故障注入的以太坊私有鏈性能測試工具。傳統的性能測試工具通過向系統發送大量請求模擬真實情況下的交易量。與傳統的行測試工具不同,PerTether引入了故障注入的概念。區塊鏈系統往往不會部署在一個穩定的可信的環境下,因為區塊鏈技術出現的契機就是它可以在不安全的環境下正常運轉。而這種環境往往更容易產生故障。

通過引入故障注入,用戶可以通過故障注入,在測試環境下模擬真實場景的故障。這種方式可以幫助以太坊開發人員在發佈前進行充分測試來發現潛在的性能故障。另外,以太坊私有鏈的使用者也可以通過故障注入測試提前發現可能出現問題的場景,進而避免在真實部署的區塊鏈上出現類似的問題。

技術創新

PerTether使用Docker技術通過簡單配置即可自動完成區塊鏈啟動與初始化。並根據測試需求部署所需的智能合約。同時,為了模擬真實場景,工具會啟動多線程異步調用接口,保障區塊鏈中每個節點都有數量接近的請求,從而模擬真實場景下以太坊私有鏈多節點併發的請求速率

區塊鏈故障種類多且複雜,在去中心化的區塊鏈上實現故障注入難度更高。區塊鏈屬於分佈式系統,節點數量多,故障類型與傳統分佈式系統有一定差異,我們根據區塊鏈特性重新劃分了故障類型並定義了相應的故障。同時,為了更好的反應區塊鏈故障對系統的影響,我們對故障等級也進行了劃分,不同類型的故障等級對區塊鏈性能與穩定性影響程度不同,在反覆進行實驗後,我們為每個故障定義了3個等級。

由於區塊鏈的區塊生成具有一定的隨機性,交易的吞吐量與延遲隨著時間變化幅度比較大,這對故障注入與故障恢復前後的對比分析帶來了困難。我們通過對數據結構進行多次處理,得到了較為清晰的圖表,能夠更好的反映出故障帶來的影響。

真實場景下的區塊鏈系統,往往可能同時出現多種故障,或者一個故障可能引發其他故障,單一的故障注入不能很好地覆蓋真實環境下複雜的情況,因此我們實現多種故障注入的可配置以探究以太坊私有鏈的性能。

PerTether是首個將故障注入與區塊鏈結合起來的工具,對於區塊鏈可能的故障類型覆蓋有限,後續可能會提出新的故障類型,或者接入新的區塊鏈系統。對此,我們實現了擴展新故障和對其他區塊鏈系統支持的良好擴展性。

工具實現

由於對異步操作的良好支持,PerTether主要用JavaScript實現。 圖1說明了PerTether的測試進程。 首先,PerTether使用測試配置來構造測試區塊鏈,包括創世塊,docker配置等。然後,PerTether部署智能合約。 同時,故障控制器初始化故障。 對於每個以太坊客戶端,PerTether派生一個線程並將請求發送到客戶端。當到了預設時間時,PerTether將注入故障。 最後,PerTether收集測試結果並生成性能報告。 最終結果包含以秒為單位的測試區塊鏈的性能指標。 根據測試任務的進展,PerTether的結構可分為以下三層。

PerTether:通過故障注入對以太坊私有鏈進行性能測試

圖1 PerTether的架構

配置層

配置層可實現以太坊測試區塊鏈的自動部署。我們選擇Geth作為測試客戶端。根據Hyperledger Caliper,該工具使用docker構建測試區塊鏈以進行性能測試。同樣,在PerTether中,所有以太坊客戶端都通過docker啟動。首先,PerTether根據配置(包括Difficulty,Gas limit)生成創世塊JSON文件。測試帳戶也應在JSON文件中初始化,其中每個帳戶的餘額都用1000個以太幣初始化。之後,PerTether啟動客戶端節點,將它們附加到引導節點,以確保節點可以相互聯繫。接下來,進行區塊挖掘。 docker客戶端啟動後,礦工節點將開始挖礦。 PerTether用戶可以修改docker-compose配置並設置礦工節點和非礦工節點的數量。最後,PerTether將智能合約部署到區塊鏈。我們選擇HelloWorld智能合約作為我們的常規工作負載。 HelloWorld是一個簡單的智能合約,具有關於字段存儲的單一功能。儘管HelloWorld無法在以太坊私有鏈上模擬真實的工作負載,但由於其資源利用率低,它可以更好地反映故障的影響。測試任務完成後,PerTether將停止區塊鏈。

交易層

事務層主要包含兩個組件,工作負載生成和事務控制器。

工作負載生成。PerTether依賴於已部署的智能合約來生成工作負載。工作負載包含交易發起帳戶,目標智能合約,函數調用參數。函數調用的參數是隨機生成的。此外,用戶可以通過覆蓋腳本來定義參數。之後,我們將帶有工作量的交易請求發送到智能合約。

事務控制器。交易控制器用於控制交易的請求率。用戶可以設置請求速率和持續時間。 PerTether啟動一組線程,每個線程將請求發送到某個客戶端節點,並使用以太坊JSON-RPC API獲取事務信息。確認交易後,將調用一個回調函數,該函數記錄交易的詳細信息。如果交易返回故障或超時,我們會將其記錄為未完成。測試完成後,將收集每筆交易的開始和結束時間以及確認狀態。最後,PerTether將以秒為單位計算出吞吐量和延遲。

故障注入層

故障注入層主要由故障控制器和四種故障實現組成。

故障控制器。當性能測試任務開始時,故障控制器將分析故障配置並初始化故障。該配置包括故障類型,開始時間和持續時間。因此,PerTether啟動計時器並在開始時間觸發故障注入事件。持續時間過後,故障控制器將取消注入的故障並恢復區塊鏈。

故障注入實現。 PerTether完全實現四種故障。對於每種故障,我們實現注入方法和恢復方法。此外,我們定義了故障級別(共識故障沒有級別,因為它只有兩個狀態)來模擬故障的嚴重性。

應用。為了模擬流量高峰,PerTether將消息發送到線程以提高請求率。隨著故障級別的上升,故障率將增加0.25、0.50、1.00。

共識。為了模擬節點故障,我們使用NodeJS docker API來控制以太坊客戶端容器。注入和取消故障時,PerTether停止並運行指定的容器。這種故障沒有級別。

智能合約。我們實現了智能合約來模擬不完善的合約。當用戶向該智能合約發送交易時,它將在一個循環中進行讀寫操作,這可能會花費大量的執行時間和精力。我們在合同中定義了三種方法。這些方法的循環計數不斷增加,與故障級別相對應。

網絡。為了實現高延遲和丟包,我們引入了稱為pumba的第三方工具。該工具專門用於docker中的網絡故障注入。在PerTether中,我們通過執行pumba命令來實現網絡故障。這三個級別分別對應於30%,60%,90%的丟包率或1000ms,4000ms,9000ms的延遲。

實驗評估

我們對實驗的性能測試是在具有8個CPU內核和32GB內存的服務器上運行的。 在每個實驗中,我們使用Docker鏡像ethereum / client-go:alltools-v1.8.26啟動4個Geth節點(其中2個是礦工)。 首先,並設定了一系列的difficulty,gas limit。 我們將請求速率從4tx / s提升到為、256tx / s。 然後,我們以固定請求速率32tx / s在區塊鏈上執行了四種故障注入實驗。 為了獲得可信賴的結果,每個配置執行了5次以上。 具有相同配置的結果具有相似的趨勢。

PerTether:通過故障注入對以太坊私有鏈進行性能測試

圖2 不同Difficulty與Gas limit的吞吐量與延遲

圖2顯示了選擇以下Difficulty(即0和1048575)和Gas limit(即2356194和4712388)時的吞吐量和 等待時間。在請求率上升之內,區塊鏈首先達到峰值吞吐量,然後一直下降到零。同時,延遲持續上升。較高的Difficulty以及較低的Gas limit會導致較低的峰值吞吐量和較高的延遲。結果表明,Difficulty和Gas limit確實可以影響區塊鏈的性能。

PerTether:通過故障注入對以太坊私有鏈進行性能測試

PerTether:通過故障注入對以太坊私有鏈進行性能測試

PerTether:通過故障注入對以太坊私有鏈進行性能測試

圖3 應用、共識、智能合約、網絡故障的實驗結果

圖3顯示了執行故障注入時的吞吐量和延遲。由於塊的生成具有一定的隨機性,因此結果數據具有相對較大的幅度抖動。結果表明,這四種故障確實影響了以太坊私有鏈的性能和穩定性。同時,隨著故障級別的上升,性能會下降。另外,我們可以找到幾個值得注意的要點。在應用程序和智能合約故障中,當故障級別上升時,吞吐量降低為零,並且在取消故障後幾乎無法恢復。在出現網絡故障時,故障消除後,吞吐量立即增加。在共識故障的情況下,延遲增加了,但吞吐量沒有減少。這種現象的原因是,當一個礦工節點發生故障時,另一個礦工將沒有競爭對手。礦工開採的所有區塊都將被區塊鏈接受。但是計算能力的下降仍然導致等待時間的增加。

致謝

本文由南京大學軟件學院 2018 級碩士王新宇翻譯轉述。

感謝國家自然科學基金(61932012,61802171,61772014)支持!


分享到:


相關文章: