區塊鏈底層平臺FISCO BCOS的網絡壓縮功能如何?

FISCO BCOS是完全開源的聯盟區塊鏈底層技術平臺,由金融區塊鏈合作聯盟(深圳)(簡稱金鍊盟)成立開源工作組通力打造。開源工作組成員包括博彥科技、華爲、深證通、神州數碼、四方精創、騰訊、微衆銀行、亦筆科技和越秀金科等金鍊盟成員機構。

代碼倉庫:https://github.com/FISCO-BCOS

作者語

外網環境下,區塊鏈系統性能受限於網絡帶寬,爲了儘量減少網絡帶寬對系統性能的影響,FISCO BCOS從relase-2.0.0-rc2開始支持網絡壓縮功能,該功能主要在發送端進行網絡數據包壓縮,在接收端將解包數據,並將解包後的數據傳遞給上層模塊。

 

本期文章講的就是FISCO BCOS的網絡壓縮功能,作者從FISCO BCOS的系統框架、核心實現、處理流程、測試結果等角度進行了解析。

 

Part 1、系統框架

 

網絡壓縮主要在P2P網絡層實現,系統框架如下:

網絡壓縮主要包括兩個過程:

  • 發送端壓縮數據包:羣組層通過P2P層發送數據時,若數據包大小超過1KB,則壓縮數據包後,將其發送到目標節點;

  • 接收端解壓數據包:節點收到數據包後,首先判斷收到的數據包是否被壓縮,若數據包是壓縮後的數據包,則將其解壓後傳遞給指定羣組,否則直接將數據傳遞給對應羣組。

 

Part 2、核心實現

 

綜合考慮性能、壓縮效率等,我們選取了Snappy來實現數據包壓縮和解壓功能。

 

數據壓縮標記位

FISCO BCOS的網絡數據包結構如下圖:

網絡數據包主要包括包頭和數據兩部分,包頭佔了16個字節,各個字段含義如下:

  • Length: 數據包長度

  • Version: 擴展位,用於擴展網絡模塊功能

  • ProtocolID: 存儲了數據包目的羣組ID和模塊ID,用於多羣組數據包路由,目前最多支持32767個羣組

  • PaketType: 標記了數據包類型

  • Seq: 數據包序列號

 

網絡壓縮模塊僅壓縮網絡數據,不壓縮數據包頭。

考慮到壓縮、解壓小數據包無法節省數據空間,而且浪費性能,在數據壓縮過程中,不壓縮過小的數據包,僅壓縮數據包大於c_compressThreshold的數據包.c_compressThreshold默認是1024(1KB)。我們擴展了Version的最高位,作爲數據包壓縮標誌:

  • Version最高位爲0,表明數據包對應的數據Data是未壓縮的數據;

  • Version最高位爲1,表明數據包對應的數據Data是壓縮後的數據。

 

Part 3、處理流程

 

下面以羣組1的一個節點向羣組內其他節點發送網絡消息包packetA爲例(比如發送交易、區塊、共識消息包等),詳細說明網絡壓縮模塊的關鍵處理流程。

 

發送端處理流程:

  • 羣組1的羣組模塊將packetA傳入到P2P層;

  • P2P判斷packetA的數據包大於c_compressThreshold,則調用壓縮接口,對packetA進行壓縮,否則直接將packetA傳遞給編碼模塊;

  • 編碼模塊給packetA加上包頭,附帶上數據壓縮信息,即:若packetA是壓縮後的數據包,將包頭Version的最高位置爲1,否則置爲0;

  • P2P將編碼後的數據包傳送到目的節點。

 

接收端處理流程:

  • 目標機器收到數據包後,解碼模塊分離出包頭,通過包頭Version字段的最高位是否爲1,判斷網絡數據是否被壓縮;

  • 若網絡數據包被壓縮過,則調用解壓接口,對Data部分數據進行解壓,並根據數據包頭附帶的GID和PID,將解壓後的數據傳遞給指定羣組的指定模塊;否則直接將數據包傳遞給上層模塊。

 

Part 4、配置與兼容

 

配置說明

  • 開啓壓縮:2.0.0-rc2及其以上版本 支持網絡壓縮功能,配置 config.ini的[p2p].enable_compresss=true

  • 關閉壓縮:config.ini的[p2p].enable_compresss=false

 

兼容性說明

  • 數據兼容:不涉及存儲數據的變更;

  • 網絡兼容rc1:向前兼容,目前僅release-2.0.0-rc2及其以上版本有網絡壓縮功能。

 

Part 5、測試結果

 

爲測試網絡壓縮效果,分別在內網和外網環境下,以同樣的壓測程序和QPS壓測開啓網絡壓縮和沒開啓網絡壓縮的四節點區塊鏈,測試結果如下。

通過測試結果可看出:

  • 內網環境下開啓壓縮對區塊鏈系統性能影響不大,運行串行solidity壓測合約時,網絡帶寬消耗降低爲未開壓縮時的三分之二;運行並行precompile壓測合約,網絡帶寬消耗降低到未開壓縮時的三分之一

  • 外網環境下:開啓壓縮可提升區塊鏈系統性能

 

圖一:帶寬對比(關閉壓縮和開啓壓縮情況下,壓測並行solidity合約和串行Precompile合約)

通過圖一可看出,執行串行solidity合約,開啓壓縮可節省三分之一帶寬;執行並行Precompile合約可節省三分 之二帶寬。 

 

圖二:TPS對比(內網和外網環境下,關閉壓縮和開啓壓縮情況下TPS)

通過圖二可看出,內網環境下,開啓壓縮對區塊鏈系統性能影響不大;外網環境下,因爲在有限帶寬限制下,開啓 壓縮可處理更多交易,區塊鏈性能提升了約三分之一。

 

內網環境測試結果

串行solidity合約(PerformanceOk) 壓縮前 Snappy壓縮後
TPS 1961.5 1939.4
入帶寬 10.88MBit/s 6.93MBit/s
出帶寬 9.08MBit/s 5.70MBit/s
並行Precompile合約(PerformanceDT) 壓縮前 Snappy壓縮後
TPS 9725 9741
入帶寬 76.06MBit/s 22.72MBit/s
出帶寬 80.48MBit/s 24.17MBit/s

外網環境測試結果

壓測場景 壓縮前 Snappy壓縮後
四節點,串行solidity合約(PerformanceOk) 1125.8 1740
四節點, 串行solidity合約(PerformanceOkD) 低於1000 1407

 


 

我們鼓勵機構成員、開發者等社區夥伴參與開源共建事業,有你在一起,會更了不起。多樣參與方式:

1 進入微信社羣,隨時隨地與圈內最活躍、最頂尖的團隊暢聊技術話題(進羣請添加小助手微信,微信ID:fiscobcosfan);

2 訂閱我們的公衆號:“FISCO BCOS開源社區”,我們爲你準備了開發資料庫、最新FISCO BCOS動態、活動、大賽等信息;

3 來Meetup與開發團隊面對面交流,FISCO BCOS正在全國舉辦巡迴Meetup,深圳、北京、上海、成都……歡迎您公衆號在菜單欄【找活動】中找到附近的Meetup,前往結識技術大咖,暢聊硬核技術;

4 參與代碼貢獻,您可以在Github提交Issue進行問題交流,歡迎向FISCO BCOS提交Pull Request,包括但不限於文檔修改、修復發現的bug、提交新的功能特性。

 

代碼貢獻指引:

https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/docs/CONTRIBUTING_CN.md

 

本文首發於公衆號【FISCO BCOS開源社區】,如轉載請註明出處,原創不易,謝謝珍惜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章