图片

在這個由三部分組成的系列中,我們將揭示能夠顯著改善在互聯網計算機協議(ICP)上運行的應用程序的數據處理的技術成就。

此次升級是 ICP 路線圖中的 Stellarator 里程碑,目前正在全網推廣,Stellarator 是鏈上數據存儲方面的一項突破,使每個子網能夠承載超過 1TB 的內存,爲之前受存儲限制的數據豐富型應用程序帶來了機遇。

這一進步使開發人員能夠構建需要大規模數據處理的複雜應用程序,從而爲區塊鏈技術帶來新的實用水平。

事不宜遲,讓我們先來開始這個系列,看看 ICP 現在如何使用 Stellarator 更新來存儲數據。

互聯網計算機上的數據持久性

這篇博文概述了存儲在互聯網計算機的副本機器上的工作原理,特別關注了最近引入的基於日誌結構合併樹(LSMT)的存儲的變化,其中包括在互聯網計算機子網上實現更多複製存儲,並使它們能夠更好地處理繁重的工作負載。

互聯網計算機由子網、虛擬機組成,這些虛擬機在 13-40 臺副本機器上進行相同複製,每個副本負責執行發送到該子網上的容器的所有消息,並存儲所有容器數據,因此,所有副本都具有子網的完整且相同的狀態。

開發人員可以將容器部署到互聯網計算機,容器與其他區塊鏈上的智能合約類似,但可以執行更通用的計算,並且比其他鏈上的智能合約存儲更多數量級的數據。

容器中保存的數據最終需要存儲在某些物理硬件上,得益於最近引入的基於 LSMT 的存儲層以及許多其他優化和改進,互聯網計算機上的子網可以存儲高達 1TB 的容器數據。

容器的大部分數據要麼存儲在其堆內存中(寫入時高達 4GB),要麼存儲在其穩定內存中(寫入時高達 500GB),還有其他形式的數據與容器相關,例如容器代碼、飛行中的消息以及各種信息,例如控制器列表和 Cycles 餘額。

ICP 的存儲層彌合了容器存儲(例如堆和穩定內存)與底層副本機的存儲硬件(例如磁盤和 RAM)之間的差距。

作爲 Stellarator 里程碑的一部分,存儲層經過了廣泛的重新設計和重新實施,以使 ICP 能夠應對未來的可擴展性挑戰,並解決舊存儲層最重要的可擴展性瓶頸,所有相關更改均已於近期完成,互聯網計算機現已運行新的存儲層實施幾個月。

本篇博文的其餘部分介紹了將存儲層重新設計爲日誌結構合併樹數據結構的過程,重新設計旨在消除與存儲相關的瓶頸,併爲存儲密集型容器的用戶和開發人員帶來更好的體驗。

對於 ICP 用戶來說,最值得注意的是,這項工作使得單個子網上的複製狀態最近增加到 1TB,此外,重新設計還使互聯網計算機能夠更好地處理寫入大量數據的容器。

檢查點

一般來說,互聯網計算機的存儲層結合使用了磁盤上的持久存儲和 RAM 中的臨時存儲,互聯網計算機如何存儲其狀態的一個關鍵概念是所謂的檢查點,檢查點是整個子網狀態存儲在磁盤上的邏輯時間點。

檢查點每 500 個塊或每隔幾分鐘以確定性方式創建一次,這意味着所有副本都將在相同的高度寫入相同的檢查點,檢查點以文件目錄的形式存儲在每個副本節點的磁盤上,目錄結構如下所示(大大簡化):

图片

在這種結構中,每個容器都存儲在自己的子目錄中,並且每個容器目錄包含用於堆內存、穩定內存和其他信息(如飛行中的消息)的單獨文件,數據以檢查點的形式保存到磁盤的原因有多種。

1. 數據持久性:副本機器可能隨時重啓,副本代碼中可能存在軟件錯誤,或者硬件可能有故障,或者數據中心的電源可能有問題,發生這種情況時,可以重新加載最新的檢查點。

請注意,即使每 500 輪才創建一次檢查點,副本也可以爲非檢查點高度重新創建狀態,副本只需要最新的檢查點以及檢查點和最新狀態之間的所有最終區塊,由於所有執行都是確定性的,因此可以重放這些區塊,並且保證重新創建的狀態完全相同,必要的區塊可以與檢查點分開保存到磁盤,也可以從其他副本中獲取。

2. 同步:所有(複製的)消息都由所有副本執行,因此,對於任何給定的高度 h,所有副本都應具有相同的狀態,該協議通過首先對狀態進行哈希處理,然後對生成的哈希進行閾值簽名來防止分歧(即當某些誠實副本最終處於與共識狀態不同的狀態時),只有當至少 ⅔(更準確地說是 2f + 1)的副本同意相同的哈希時,才能創建這樣的閾值簽名,子網才能繼續運行。

但是,互聯網計算機的子網可以擁有較大的狀態,在撰寫本文時,限制爲 1TB,在保持每秒最多 2.5 個塊(互聯網計算機上最快的子網目前做到的)的同時,在每個塊之後對這麼多數據進行哈希處理是不可行的,因此,互聯網計算機僅對非檢查點高度的狀態的選定部分進行哈希處理,例如,包括每個容器的一些基本信息、對入口消息的最近響應以及發送到其他子網的 XNet 消息。

對於檢查點,協議會哈希整個狀態以獲得名爲清單的數據結構,此清單通過哈希檢查點目錄中的所有文件來計算,幷包含分塊爲 1MB 塊的所有單個文件的哈希,在清單計算結束時,將計算清單的根哈希,涵蓋清單中的所有單個哈希,然後由子網對其進行閾值簽名,計算清單可能需要數十秒,但這項工作只需每 500 個塊進行一次,並且在後臺與容器執行並行執行。

3. 狀態同步:互聯網計算機允許通過 NNS 提案更改子網拓撲,當副本節點加入子網時,它可以從其他副本節點獲取最新的檢查點,回想一下,檢查點是文件的集合,因此,在使用其根哈希和子網的閾值簽名驗證清單後,狀態同步協議可以逐塊獲取文件,同時將獲取的塊的哈希值與清單中的哈希值進行比較,如果所有檢查都成功,則副本可以得出結論,即獲取的狀態對應於檢查點高度處各個子網的商定狀態,如果副本因其他原因落後,並且與健康狀態的差距太大而無法趕上純粹的塊重放,則也會觸發狀態同步。

4. 最大狀態大小:目前,最大狀態大小爲 1TB,而副本節點機器的 RAM 爲 512GB,因此,不可能將整個狀態加載到 RAM 中,互聯網計算機使用 RAM 主要用於保存尚未持久化的最新數據,以及緩存數據以提高性能。

PageMap 和非檢查點高度

由於每 500 個區塊才創建一次檢查點,因此 ICP 需要針對非檢查點高度爲容器提供不同的存儲空間,存儲層遵循的基本思想是,這些數據以最後一個檢查點的組合形式存儲在磁盤上,此後的任何更改都存儲在 RAM 中。

PageMap 是副本針對子網狀態的大部分內容的實現,子網狀態的絕大部分是容器狀態,特別是容器的堆和穩定內存。

目前,容器最多可以擁有 4GB 的堆內存、500GB 的穩定內存,並且總子網狀態限制爲 1TB,但所有這些限制將來都可能會發生變化,這兩種內存都可以通過複製(更新)和非複製(查詢)容器調用讀取,也可以通過複製調用進行修改。

PageMap 數據結構旨在實現對內存的高效讀寫,以及支持高效寫入檢查點,一個特定目標是使性能與內存的總大小無關,請注意,PageMap 這個名稱源於這樣一個事實:所有讀寫的粒度都是 4KB 的頁面,這與底層操作系統使用的頁面大小相同。

PageMap 將狀態存儲在兩個層中,第一層稱爲存儲,是來自上一個檢查點的文件,它們表示上一個檢查點高度的狀態,第二層,即頁面增量,表示自該檢查點以來的所有更改,並存儲在 RAM 中。

從 PageMap 讀取時,返回的數據要麼從頁面增量中獲取,要麼從檢查點文件中讀取(如果缺失),寫入 PageMap 是通過使用新數據修改頁面增量來完成的。

图片

檢查點生命週期

存儲層的主要任務是將檢查點寫入磁盤並使所有 PageMap 保持最新狀態,寫入新檢查點時,所有頁面增量都會刷新到磁盤,從而更新所有 PageMap 的存儲部分。

爲了保證所有數據都得到保存,副本需要始終保留已進行閾值簽名的最新檢查點,這意味着不可能簡單地覆蓋舊的檢查點文件,因爲任何此類修改都會在新檢查點完全寫入之前更改上一個檢查點,從而有丟失數據的風險,同時,每 500 輪將一個完整的檢查點寫入磁盤(最多 1TB)的成本將非常高昂,相反,創建新的檢查點包括 3 個基本步驟:

  • 將舊檢查點“複製”到臨時文件夾,稱爲提示;

  • 修改提示以代表新檢查點的數據;

  • 將提示重命名爲新的檢查點目錄(以便以原子方式創建新的檢查點)。

第一步可能是最昂貴的一步,因爲狀態越大,複製文件所需的時間越長,因此檢查點文件就越大。

然而,這正是檢查點和日誌結構合併樹的文件格式發揮作用的地方,通過使用 LSMT,此步驟成本低廉,並且不會隨狀態大小而擴展,相比之下,在 LSMT 重新設計存儲層之前,此步驟緩慢且不可預測。

日誌結構合併樹

日誌結構合併樹(LSMT)是一種廣泛使用的數據結構,尤其適用於數據庫,在互聯網計算機上,它們被用作 PageMaps 存儲部分的基礎,它可以解決的一個特殊問題是,它簡化了檢查點生命週期的“複製”步驟,因爲所有文件都只寫入一次,並且永遠不會被修改。

使用 LSMT,通過寫入額外的覆蓋文件來修改(邏輯)狀態,要讀取頁面的值,算法首先檢查最近寫入的覆蓋文件,看該文件中是否存在該頁面,如果存在,則從該覆蓋文件中讀取頁面的值,否則,檢查下一個較舊的覆蓋文件,在 Internet Computer 使用的實現中,如果頁面不存在於任何覆蓋文件中,則將其讀爲全零。

下圖顯示了一組代表容器狀態的三個覆蓋文件,垂直箭頭顯示對數據的不同讀取以及最終讀取數據的文件。

图片

LSMT 的檢查點生命週期如下所示:

  • 將上一個檢查點的所有文件硬鏈接到一個臨時文件夾,稱爲 tip;

  • 寫入包含自上次檢查點以來所有更改的新覆蓋文件;

  • 將提示重命名爲新的檢查點目錄(爲了原子性)。

關鍵在於每個覆蓋文件只寫入一次,並且永遠不會被修改,這樣,在磁盤上設置多個檢查點並通過硬鏈接在它們之間共享一些文件是安全的,請注意,如果檢查點生命週期嘗試修改任何文件,則此相同過程將不起作用,如果文件有多個硬鏈接,則修改其中任何一個都會更改所有硬鏈接中的數據,這會篡改先前已認證的檢查點。

日誌結構合併樹可能會存儲同一數據範圍的多個版本,這會導致存儲開銷,其定義爲所有覆蓋文件的大小與所表示數據的邏輯大小之比,此外,數據可能分佈在多個文件中。

隨着存儲開銷或覆蓋文件數量的增加,存儲層實現將安排合併,合併通過獲取一組覆蓋文件並將其替換爲僅包含每條數據的最新版本的單個文件來重新組織數據,合併是爲具有特別高的存儲開銷或文件數量的 PageMap 安排的,並且在後臺執行,以便它們不會干擾容器消息的執行。

之前使用 Reflinks 的設計

互聯網計算機最初的存儲層並不依賴於 LSMT,從 2021 年互聯網計算機誕生到 2024 年,存儲層嚴重依賴於重新鏈接。

重新鏈接,有時也稱爲寫時複製,是一種用於複製文件的文件系統操作,某些文件系統支持該操作,互聯網計算機的副本使用支持該操作的 XFS 文件系統,重新鏈接與普通文件複製的不同之處在於它不會複製整個文件內容,相反,文件系統會記住原始文件和新文件之間共享哪些數據,重新鏈接與硬鏈接的不同之處還在於兩個文件都可以彼此獨立地修改。

在舊的存儲層設計中,檢查點生命週期的工作方式如下:

  • 將上一個檢查點的所有文件重新鏈接到一個臨時文件夾,稱爲 tip;

  • 根據自上次檢查點以來的所有更改來修改提示中的文件;

  • 將提示重命名爲新的檢查點目錄。

一個潛在的優勢是,PageMap 將由單個文件在檢查點中表示,從而避免存儲開銷,但是,要修改文件以適應新的檢查點高度,需要重新鏈接上一個檢查點的相應文件,而不是硬鏈接。

LSMT 相對於 Reflinks 的優勢

原則上,重新鏈接保證了硬鏈接的速度和複製的可用性,不幸的是,隨着互聯網計算機的數據需求不斷增加(無論是 I/O 吞吐量還是總數據量),由於多種原因,重新鏈接變成了性能瓶頸。

1. 重新鏈接速度慢:重新鏈接文件所需的時間可能相差很大,在某些情況下可能只需要幾秒鐘,但在實驗中,我們還觀察到重新鏈接 370GB 需要長達 10 個小時,在 Internet Computer 的舊檢查點邏輯中,10 小時的重新鏈接步驟會導致整個子網停滯 10 小時。

碎片化會導致較差的重新鏈接速度,在內部,XFS 文件系統維護將文件的各個部分映射到磁盤上的實際數據塊的數據結構,當遍歷這些數據結構的成本變得很高時,就會出現碎片化和較慢的重新鏈接速度。

碎片化尤其可能由以下序列觸發:大量寫入文件,然後重新鏈接它,大量寫入其中一個副本,再次重新鏈接它,等等,不幸的是,考慮到互聯網計算機上的檢查點工作流程,大量使用的容器恰好會觸發這種行爲。

另一方面,硬鏈接具有一致的性能,不受任何碎片問題的影響。

在引入日誌結構合併樹之前,已經實施了許多權宜之計,這些措施包括手動對文件進行碎片整理(通過讀取文件並將其寫回)以及將文件寫入更大的連續部分,這兩種方法都以較大的寫入放大爲代價,並且仍然可能導致長達 30 分鐘的停頓。

2. 最大狀態大小:除了由於碎片過多而導致的非常長的重新鏈接時間之外,即使是中等程度的碎片,重新鏈接時間也會與子網存儲的數據總量成比例,在存儲層的先前實現中,互聯網計算機規定每個子網存儲量不得超過 700GB,這個數字在很大程度上取決於最多 20-30 秒內可以重新鏈接多少中等碎片的數據。

使用硬鏈接時,檢查點時間不會以相同的方式隨着數據大小而擴展,從而消除這一瓶頸。

3. 多線程性能不佳:檢查點邏輯的目標之一是儘可能避免同步操作,因爲在檢查點期間,容器執行會停滯,自然,需要考慮的是,是否可以在執行繼續的同時在後臺執行重新鏈接(即使速度很慢),不幸的是,經驗表明,不可能同時重新鏈接和讀取文件,因此,與執行並行進行重新鏈接只會導致執行緩慢。

在新的存儲層設計中,硬鏈接與執行並行進行,並且它們不會互相減慢速度。

4. 緩存:如上所述,從容器內存讀取數據會同時從 RAM 讀取數據和從底層檢查點文件讀取數據,重複讀取同一個文件通常不會導致必須從實際硬盤或 SSD 多次讀取數據,相反,這些數據會被操作系統緩存,不幸的是,重新鏈接會干擾緩存,因爲首先重新鏈接文件然後從新副本讀取不會使用緩存,因此,在互聯網計算機上,在寫入檢查點後,人們會看到磁盤讀取出現大量(且緩慢)的峯值,因爲所有讀取都會切換到新文件,此外,顯式計算(即爲達成共識而計算所有檢查點文件的哈希值)也從更好的緩存中受益匪淺。

相反,當硬鏈接文件時,所有緩存都會被保留,任何最近讀取或寫入的數據,即使是在之前的檢查點間隔內發生的,仍將被緩存,因此可以快速檢索。

結果

LSMT 存儲層於 2024 年第二季度的幾周內推廣到互聯網計算機的所有子網,下圖顯示了副本代碼升級前後的指標,其中紅色垂直線表示啓用 LSMT 存儲層的時間。

第一張圖顯示了 w4rem 子網的檢查點時間,該子網託管了用於比特幣集成的容器,與許多其他子網相比,比特幣子網託管的容器的堆和穩定內存都具有寫入繁重的工作負載,因此,碎片化是該子網的一個特別令人擔憂的問題。

图片

從指標來看,檢查點時間從 20 多秒縮短至僅 1-2 秒,這主要是因爲消除了重新鏈接步驟,該步驟佔據了 20 秒的大部分時間。

對於比特幣容器用戶來說,其好處是響應速度更快,在檢查點期間,子網不會處理任何更新調用或複製查詢,如果用戶在檢查點開始時向比特幣容器發送更新調用或複製查詢,則至少需要 20 秒才能收到響應,使用 LSMT 存儲層基本上可以消除此類不一致的響應時間。

第二張圖顯示了 k44fs 子網上的最終確定率,最終確定率或區塊率是子網每秒產生的區塊數量。

图片

互聯網計算機將每輪執行的指令數限制爲大致對應於其在一秒鐘內可以完成的工作量的值,以便最終確定率可以保持在每秒 1 個區塊以上。

在升級到 LSMT 存儲層之前,完成率有規律地下降,這與檢查點完全對應,檢查點影響完成率主要有兩個原因,首先是創建檢查點所需的時間,在此期間不會執行任何塊,升級後,這方面的影響會減少,因爲檢查點時間通常要短得多。

第二個原因是 LSMT 存儲層的緩存行爲更好,特別是,舊存儲層實現中的重新鏈接步驟導致緩存失效,因此,在檢查點之後,任何從其內存中讀取的容器都會導致副本從磁盤獲取該數據,這比存儲在 RAM 中的緩存中可用的相同數據要慢幾個數量級,新 LSMT 存儲層不存在此問題。

如指標所示,升級後最終確定率的下降明顯變小,這是因爲檢查點本身速度更快,不再需要重新鏈接,而且文件緩存也不再無效。

對於該子網上的容器用戶來說,這意味着更快的響應時間和更高的吞吐量。

結論

圍繞日誌結構合併樹數據結構重新設計互聯網計算機的存儲層是平臺可擴展性和性能的一項重要投資,它不僅使一些內存密集型工作負載成爲可能,還允許互聯網計算機爲容器提供更大的狀態。

在人工智能和鏈上運行大型語言模型的背景下,對大數據進行操作的容器尤其有趣,此類容器不僅依賴於大量數據存儲,還嚴重依賴 I/O 吞吐量。

此外,它還爲後續改進奠定了基礎,例如通過更好地利用併發性來減輕關鍵路徑上的繁重工作量,從而使互聯網計算機的響應速度更快,原始存儲層的經驗表明,避免重新鏈接對於實現這一點至關重要,而 LSMT 數據結構可以做到這一點。

您喜歡這篇文章嗎?在 DFINITY Developers X 頻道上分享您的想法,明天加入我們的 Stellarator 之旅第 2 部分,與 Luc Bläser 一起探討增強正交持久性。

图片


#Stellarator #ICP #AI幣

你關心的 IC 內容

技術進展 | 項目信息 | 全球活動

收藏關注 IC 幣安頻道

掌握最新資訊