この三部構成のシリーズでは、インターネットコンピュータプロトコル(ICP)上で動作するアプリケーションのデータ処理を大幅に改善できる技術的成果を明らかにします。
このアップグレードはICPのロードマップにおけるStellaratorマイルストーンであり、現在全ネットワークで展開されています。Stellaratorは、各サブネットが1TBを超えるメモリを持つことを可能にする、オンチェーンデータストレージにおけるブレークスルーです。これにより、以前はストレージ制限に悩まされていたデータ集約型アプリケーションに機会がもたらされました。
この進歩により、開発者は大規模なデータ処理が必要な複雑なアプリケーションを構築できるようになり、ブロックチェーン技術に新しい実用レベルをもたらします。
事を急がずに、このシリーズを開始し、ICPが現在Stellaratorの更新を使用してデータを保存する方法を見てみましょう。
インターネットコンピュータにおけるデータの永続性
この記事では、インターネットコンピュータのコピー機に保存されている作業の仕組みを概説し、特に最近導入されたログ構造マージツリー(LSMT)ベースのストレージの変化に焦点を当てています。これには、インターネットコンピュータのサブネットにおけるより多くのコピーのストレージの実装と、重いワークロードをより良く処理できるようにすることが含まれます。
インターネットコンピュータは、サブネットと仮想マシンで構成され、これらの仮想マシンは13〜40台のコピー機で同じコピーを行い、各コピーはそのサブネットに送信されたコンテナのすべてのメッセージを実行し、すべてのコンテナデータを保存します。したがって、すべてのコピーはサブネットの完全で同じ状態を持っています。
開発者は、インターネットコンピュータにコンテナをデプロイできます。コンテナは他のブロックチェーン上のスマートコントラクトに似ていますが、より一般的な計算を実行でき、他のチェーンのスマートコントラクトよりもはるかに多くのデータを保存できます。
コンテナに保存されているデータは、最終的に物理ハードウェア上に保存される必要があります。最近導入されたLSMTベースのストレージレイヤーや多くの他の最適化と改善のおかげで、インターネットコンピュータのサブネットは最大1TBのコンテナデータを保存できます。
コンテナの大部分のデータは、そのヒープメモリ(書き込み時最大4GB)に保存されるか、安定メモリ(書き込み時最大500GB)に保存され、コンテナコード、フライト中のメッセージ、およびコントローラーリストやサイクル残高などのさまざまな情報など、コンテナに関連する他の形式のデータもあります。
ICPのストレージレイヤーは、コンテナストレージ(たとえば、ヒープおよび安定メモリ)と基盤となるコピー機のストレージハードウェア(たとえば、ディスクおよびRAM)とのギャップを埋めます。
Stellaratorのマイルストーンの一部として、ストレージレイヤーは大規模に再設計され、再実施され、ICPが将来のスケーラビリティの課題に対処できるようにし、古いストレージレイヤーの最も重要なスケーラビリティボトルネックを解決しました。すべての関連する変更は最近完了し、インターネットコンピュータは新しいストレージレイヤーの実装を数ヶ月間運用しています。
この記事の残りの部分では、ストレージレイヤーをログ構造マージツリーのデータ構造に再設計するプロセスについて説明します。再設計は、ストレージ関連のボトルネックを排除し、ストレージ集約型コンテナのユーザーと開発者により良い体験をもたらすことを目的としています。
ICPユーザーにとって特に注目すべき点は、この作業により単一のサブネットのコピー状態が最近1TBに増加したことです。さらに、再設計によりインターネットコンピュータは大量のデータを書き込むコンテナをより良く処理できるようになりました。
チェックポイント
一般的に、インターネットコンピュータのストレージレイヤーは、ディスク上の永続ストレージとRAM内の一時ストレージを組み合わせて使用します。インターネットコンピュータがその状態をどのように保存するかの重要な概念は、チェックポイントと呼ばれるもので、チェックポイントはサブネット全体の状態がディスクに保存される論理的な時間点です。
チェックポイントは500ブロックごとまたは数分ごとに決定論的に作成されます。これは、すべてのコピーが同じ高さで同じチェックポイントを書き込むことを意味します。チェックポイントはファイルディレクトリの形式で各コピーのノードのディスクに保存され、ディレクトリ構造は次のようになります(大幅に簡略化されています):
この構造では、各コンテナは独自のサブディレクトリに保存され、各コンテナディレクトリにはヒープメモリ、安定メモリ、およびフライト中のメッセージなどの情報用の個別ファイルが含まれています。データがチェックポイントの形式でディスクに保存される理由はさまざまです。
1. データの永続性:コピー機はいつでも再起動でき、コピーコードの中にソフトウェアのバグが存在する可能性があり、ハードウェアに故障があるかもしれず、データセンターの電源に問題があるかもしれません。このような場合には、最新のチェックポイントを再ロードできます。
ご注意ください。500ラウンドごとにチェックポイントが作成される場合でも、コピーは非チェックポイントの高さに対して状態を再作成できます。コピーは最新のチェックポイントとチェックポイントと最新の状態の間のすべての最終ブロックのみを必要とします。すべての実行は決定的であるため、これらのブロックを再生することができ、再作成された状態が完全に同じであることが保証されます。必要なブロックはチェックポイントからディスクに分けて保存することも、他のコピーから取得することもできます。
2. 同期:すべての(コピーされた)メッセージはすべてのコピーによって実行されます。したがって、任意の高さhに対して、すべてのコピーは同じ状態を持つべきです。このプロトコルは、まず状態をハッシュ処理し、その後生成されたハッシュに閾値署名を行うことで分岐を防ぎます(すなわち、いくつかの誠実なコピーが最終的に合意状態とは異なる状態にある場合)。少なくとも⅔(より正確には2f + 1)のコピーが同じハッシュに同意するときにのみ、そのような閾値署名を作成できます。サブネットはその後も実行を続けることができます。
ただし、インターネットコンピュータのサブネットは、より大きな状態を持つことができます。この記事執筆時点では、制限は1TBであり、毎秒最大2.5ブロック(インターネットコンピュータで最も速いサブネットが現在実現している)を維持しながら、これほど多くのデータに対してハッシュ処理を行うことは不可能です。したがって、インターネットコンピュータは非チェックポイントの高さの状態の選択された部分に対してのみハッシュ処理を行います。たとえば、各コンテナの基本情報、エントリメッセージへの最近の応答、および他のサブネットに送信されたXNetメッセージを含みます。
チェックポイントの場合、プロトコルは全体の状態をハッシュして、リストと呼ばれるデータ構造を取得します。このリストは、チェックポイントディレクトリ内のすべてのファイルをハッシュして計算され、1MBブロックに分割されたすべての単一ファイルのハッシュを含みます。リストの計算が終了すると、リスト内のすべての単一ハッシュをカバーするリストのルートハッシュが計算され、サブネットによって閾値署名が行われます。リストの計算には数十秒かかることがありますが、この作業は500ブロックごとに1回のみ行われ、バックグラウンドでコンテナの実行と並行して実行されます。
3. 状態同期:インターネットコンピュータは、NNS提案を通じてサブネットトポロジーを変更することを許可します。コピーのノードがサブネットに参加すると、他のコピーのノードから最新のチェックポイントを取得できます。思い出してください、チェックポイントはファイルの集合体です。したがって、その根ハッシュとサブネットの閾値署名検証リストを使用した後、状態同期プロトコルはファイルをブロック単位で取得し、取得したブロックのハッシュ値をリスト内のハッシュ値と比較します。すべてのチェックが成功すると、コピーは取得した状態がチェックポイントの高さにおける各サブネットの合意された状態に対応するという結論を導き出せます。コピーが他の理由で遅れていて、健康状態とのギャップが大きすぎて純粋なブロック再生に追いつけない場合も、状態同期がトリガーされます。
4. 最大状態サイズ:現在、最大状態サイズは1TBですが、コピーのノード機械のRAMは512GBです。したがって、全体の状態をRAMに読み込むことは不可能です。インターネットコンピュータは、RAMを主にまだ永続化されていない最新データを保存するために使用し、パフォーマンスを向上させるためにデータをキャッシュします。
PageMapと非チェックポイントの高さ
500ブロックごとにチェックポイントが作成されるため、ICPは非チェックポイントの高さに対して異なるストレージスペースを提供する必要があります。ストレージレイヤーが従う基本的な考え方は、これらのデータが最後のチェックポイントの組み合わせの形式でディスクに保存され、その後の変更がRAMに保存されることです。
PageMapは、コピーがサブネット状態の大部分の内容を実装しており、サブネット状態の大部分はコンテナの状態、特にコンテナのヒープおよび安定メモリです。
現在、コンテナは最大4GBのヒープメモリ、500GBの安定メモリを持ち、総サブネット状態の制限は1TBですが、これらの制限は将来的に変更される可能性があります。両方のメモリは、コピー(更新)および非コピー(クエリ)コンテナ呼び出しを通じて読み取られ、コピー呼び出しを通じて修正されることができます。
PageMapデータ構造は、メモリへの効率的な読み書きを実現するために設計されており、チェックポイントへの効率的な書き込みをサポートします。特定の目標は、パフォーマンスがメモリの総サイズに依存しないようにすることです。PageMapという名前は、すべての読み書きの粒度が4KBのページであるという事実に由来しています。これは、基盤となるオペレーティングシステムで使用されるページサイズと同じです。
PageMapは状態を2つの層に保存します。最初の層はストレージと呼ばれ、前のチェックポイントからのファイルを含み、これらは前のチェックポイントの高さの状態を表します。第二の層、ページインクリメントは、そのチェックポイント以来のすべての変更を表し、RAMに保存されます。
PageMapからの読み取り時に返されるデータは、ページインクリメントから取得されるか、チェックポイントファイルから読み取られます(存在しない場合)。PageMapへの書き込みは、新しいデータを使用してページインクリメントを修正することによって行われます。
チェックポイントライフサイクル
ストレージレイヤーの主なタスクは、チェックポイントをディスクに書き込み、すべてのPageMapを最新の状態に保つことです。新しいチェックポイントを書くと、すべてのページインクリメントがディスクにフラッシュされ、すべてのPageMapのストレージ部分が更新されます。
すべてのデータが保存されることを保証するために、コピーは常に閾値署名された最新のチェックポイントを保持する必要があります。これは、古いチェックポイントファイルを単純に上書きすることができないことを意味します。なぜなら、そのような変更は、新しいチェックポイントが完全に書き込まれる前に前のチェックポイントを変更し、データが失われるリスクがあるからです。また、500ラウンドごとに1TBまでの完全なチェックポイントをディスクに書き込むコストは非常に高くつきます。反対に、新しいチェックポイントを作成するには、3つの基本的なステップが含まれます:
古いチェックポイントを「コピー」するための一時フォルダ、ヒントと呼ばれるもの;
新しいチェックポイントのデータを表すためにヒントを修正;
ヒントを新しいチェックポイントディレクトリに名前を変更する(原子的に新しいチェックポイントを作成するために)。
最初のステップは最も高価なステップになる可能性があります。状態が大きいほど、ファイルをコピーするのに必要な時間が長くなり、それに伴いチェックポイントファイルも大きくなります。
しかし、これこそがチェックポイントとログ構造マージツリーのファイルフォーマットが機能する場所であり、LSMTを使用することによって、このステップのコストは低く、状態サイズに応じて拡張されることはありません。対照的に、LSMTがストレージレイヤーを再設計する前のこのステップは遅く予測不可能でした。
ログ構造マージツリー
ログ構造マージツリー(LSMT)は広く使用されているデータ構造であり、特にデータベースに適しています。インターネットコンピュータでは、これらはPageMapsストレージ部分の基礎として使用されます。解決できる特別な問題の1つは、チェックポイントライフサイクルの「コピー」ステップを単純化することです。なぜなら、すべてのファイルは1回だけ書き込まれ、決して変更されないからです。
LSMTを使用して、追加のオーバーレイファイルに書き込むことで(論理)状態を修正します。ページの値を読み取るために、アルゴリズムは最初に最近書き込まれたオーバーレイファイルをチェックし、そのファイルにそのページが存在するかどうかを確認します。存在する場合は、そのオーバーレイファイルからページの値を読み取り、そうでない場合は、次の古いオーバーレイファイルをチェックします。インターネットコンピュータで使用される実装では、ページがオーバーレイファイルのいずれにも存在しない場合、ゼロとして読み取られます。
下の図は、コンテナの状態を表す3つの上書きファイルのセットを示しています。垂直の矢印はデータの異なる読み取りを示し、最終的に読み取られたデータのファイルを示します。
LSMTのチェックポイントライフサイクルは次のようになります:
前のチェックポイントのすべてのファイルを一時フォルダにハードリンクする、ヒントと呼ばれるもの;
前回のチェックポイント以来のすべての変更を含む新しい上書きファイルを書く;
ヒントを新しいチェックポイントディレクトリに名前を変更する(原子性のために)。
重要なのは、各オーバーレイファイルは一度だけ書き込まれ、決して変更されないことです。これにより、ディスク上に複数のチェックポイントを設定し、それらの間でハードリンクを使って一部のファイルを共有することが安全になります。チェックポイントライフサイクルがファイルを変更しようとすると、この同じプロセスは機能しなくなることに注意してください。ファイルに複数のハードリンクがある場合、それらのいずれかを変更すると、すべてのハードリンク内のデータが変更され、以前に認証されたチェックポイントが改ざんされることになります。
ログ構造マージツリーは、同じデータ範囲の複数のバージョンを保存することができ、これがストレージオーバーヘッドを引き起こします。ストレージオーバーヘッドは、すべてのオーバーレイファイルのサイズと表されるデータの論理サイズとの比率として定義され、さらに、データは複数のファイルに分散している可能性があります。
ストレージオーバーヘッドやオーバーレイファイルの数が増えると、ストレージレイヤーの実装はマージをスケジュールします。マージは、オーバーレイファイルのセットを取得し、それを各データの最新バージョンを含む単一のファイルに置き換えることによってデータを再編成します。マージは、特に高いストレージオーバーヘッドやファイル数を持つPageMapのためにスケジュールされ、バックグラウンドで実行されるため、コンテナメッセージの実行に干渉しません。
以前はReflinksを使用した設計
インターネットコンピュータの初期のストレージレイヤーはLSMTに依存しておらず、2021年にインターネットコンピュータが誕生してから2024年まで、ストレージレイヤーは再リンクに大きく依存していました。
再リンクは、時には書き込み時コピーとも呼ばれる、ファイルをコピーするためのファイルシステム操作です。この操作をサポートするファイルシステムはあります。インターネットコンピュータのコピーはこの操作をサポートするXFSファイルシステムを使用し、再リンクは通常のファイルコピーとは異なり、ファイル全体の内容をコピーしません。代わりに、ファイルシステムは元のファイルと新しいファイル間で共有されるデータを記憶します。再リンクはハードリンクとも異なり、2つのファイルは互いに独立して変更できます。
古いストレージレイヤー設計では、チェックポイントライフサイクルは次のように機能していました:
前のチェックポイントのすべてのファイルを一時フォルダに再リンクする、ヒントと呼ばれるもの;
前回のチェックポイント以来のすべての変更に基づいてヒント内のファイルを修正する;
ヒントを新しいチェックポイントディレクトリに名前を変更する。
潜在的な利点は、PageMapがチェックポイント内で単一のファイルによって表され、ストレージオーバーヘッドを回避することです。ただし、新しいチェックポイントの高さに合わせてファイルを変更するには、ハードリンクではなく前のチェックポイントの対応するファイルを再リンクする必要があります。
LSMTはReflinksに対する利点
原則として、再リンクはハードリンクの速度とコピーの可用性を保証しますが、不幸なことに、インターネットコンピュータのデータの需要が高まるにつれて(I/Oスループットや総データ量のいずれか)、さまざまな理由で再リンクはパフォーマンスのボトルネックになりました。
1. 再リンク速度が遅い:ファイルを再リンクするのに必要な時間は大きく異なる場合があります。ある場合には数秒しかかからないかもしれませんが、実験では370GBの再リンクに最大10時間かかることも観察されました。インターネットコンピュータの古いチェックポイントロジックでは、10時間の再リンクステップがサブネット全体を10時間停止させる結果となります。
フラグメンテーションは悪化した再リンク速度を引き起こします。内部的に、XFSファイルシステムはファイルの各部分をディスク上の実際のデータブロックにマッピングするデータ構造を維持します。これらのデータ構造を遍歴するコストが高くなると、フラグメンテーションと遅い再リンク速度が発生します。
フラグメンテーションは特に次のシーケンスによって引き起こされる可能性があります:大量のファイルへの書き込み、その後再リンク、片方のコピーへの大量の書き込み、再リンク等。不幸なことに、インターネットコンピュータ上のチェックポイントワークフローを考慮すると、大量に使用されるコンテナがちょうどこの動作を引き起こすことになります。
一方、ハードリンクは一貫したパフォーマンスを持ち、フラグメンテーションの問題の影響を受けません。
ログ構造マージツリーが導入される前に、多くの緊急対策が実施されました。これには、ファイルを手動でデフラグ(ファイルを読み取って書き戻す)したり、ファイルをより大きな連続部分に書き込んだりすることが含まれます。これらの2つの方法は、より大きな書き込みの増幅を代償としており、最大30分の停止を引き起こす可能性があります。
2. 最大状態サイズ:フラグメンテーションが多すぎて非常に長い再リンク時間を引き起こすだけでなく、ある程度のフラグメンテーションがあっても、再リンク時間はサブネットストレージに保存されているデータの総量に比例します。ストレージレイヤーの以前の実装では、インターネットコンピュータは各サブネットのストレージ量が700GBを超えてはならないと規定しており、この数字は最大20〜30秒で中程度のフラグメンテーションのデータを再リンクできるかどうかに大きく依存しています。
ハードリンクを使用すると、チェックポイント時間はデータサイズに応じて同じ方法で拡張されず、このボトルネックを排除します。
3. マルチスレッドパフォーマンスが悪い:チェックポイントロジックの目標の1つは、できるだけ同期操作を避けることです。なぜなら、チェックポイント中はコンテナの実行が停滞するからです。自然に、実行が続く間にバックグラウンドで再リンクを実行できるかどうかを考慮する必要があります(たとえそれが非常に遅い場合でも)。不幸なことに、経験は、再リンクとファイルの読み取りを同時に行うことができないことを示しています。したがって、実行と並行して再リンクを行うことは、実行を遅くするだけになります。
新しいストレージレイヤー設計では、ハードリンクは実行と並行して行われ、互いに速度を低下させることはありません。
4. キャッシュ:前述のように、コンテナメモリからデータを読み取ると、RAMからのデータと基盤となるチェックポイントファイルからのデータが同時に読み取られます。同じファイルを繰り返し読み取ることは、実際のハードディスクまたはSSDから複数回読み取る必要がないことがよくあります。代わりに、これらのデータはオペレーティングシステムによってキャッシュされます。不幸なことに、再リンクはキャッシュに干渉します。なぜなら、最初にファイルを再リンクしてから新しいコピーから読み取ると、キャッシュが使用されなくなるからです。したがって、インターネットコンピュータでは、チェックポイントを書き込んだ後、ディスク読み取りが大量(かつ遅い)なピークを示すことがよくあります。すべての読み取りが新しいファイルに切り替わるからです。さらに、明示的な計算(すなわち、合意に達するためにすべてのチェックポイントファイルのハッシュ値を計算すること)も、より良いキャッシュから大きな利益を得ています。
逆に、ハードリンクファイルを使用すると、すべてのキャッシュが保持され、最近読み取られたまたは書き込まれたデータは、以前のチェックポイント間隔内に発生した場合でもキャッシュされ、迅速に取得できます。
結果
LSMTストレージレイヤーは2024年第2四半期の数週間内にインターネットコンピュータのすべてのサブネットに展開されました。下の図は、コピーコードのアップグレード前後の指標を示しており、赤い垂直線はLSMTストレージレイヤーを有効にした時間を示しています。
最初の図は、ビットコイン統合用のコンテナをホスティングしているw4remサブネットのチェックポイント時間を示しています。多くの他のサブネットと比較して、ビットコインサブネットがホスティングしているコンテナのヒープと安定メモリは、書き込みが重いワークロードを持っています。そのため、フラグメンテーションはこのサブネットにとって特に懸念される問題です。
指標を見ると、チェックポイントの時間は20秒以上からわずか1〜2秒に短縮されました。これは主に再リンクステップが排除されたためであり、このステップは20秒の大部分の時間を占めていました。
ビットコインコンテナユーザーにとっての利点は、応答速度が速く、チェックポイント中にサブネットは更新呼び出しやコピークエリを処理しません。ユーザーがチェックポイント開始時にビットコインコンテナに更新呼び出しやコピークエリを送信すると、応答を受け取るまでに少なくとも20秒かかります。LSMTストレージレイヤーを使用することで、このような不整合な応答時間を基本的に排除できます。
2番目の図はk44fsサブネットの最終確定率を示しています。最終確定率またはブロック率は、サブネットが毎秒生成するブロックの数です。
インターネットコンピュータは、1秒間に完了できる作業量におおよそ対応する値に実行される命令の数を制限し、最終的な確定率が毎秒1ブロック以上に維持されるようにします。
LSMTストレージレイヤーにアップグレードする前に、完了率は規則的に低下しました。これはチェックポイントに完全に対応しており、チェックポイントが完了率に影響を与える主な理由は2つあります。まず、チェックポイントを作成するのに必要な時間、期間中はブロックが実行されません。アップグレード後、この影響は軽減されます。チェックポイント時間は通常、はるかに短くなります。
第二の理由は、LSMTストレージレイヤーのキャッシュ動作がより良好であることです。特に、古いストレージレイヤー実装の再リンクステップはキャッシュの無効化を引き起こしました。したがって、チェックポイントの後、メモリから読み取られたコンテナは、コピーがディスクからそのデータを取得することになり、RAMに保存されているキャッシュの可用性よりも数桁遅くなります。新しいLSMTストレージレイヤーではこの問題は存在しません。
指標が示すように、アップグレード後の最終確定率の低下は明らかに小さくなりました。これは、チェックポイント自体が速くなり、再リンクがもはや必要なくなり、ファイルキャッシュも無効にならなくなったためです。
このサブネットのコンテナユーザーにとって、これはより速い応答時間と高いスループットを意味します。
結論
ログ構造マージツリーのデータ構造を中心にインターネットコンピュータのストレージレイヤーを再設計することは、プラットフォームのスケーラビリティとパフォーマンスの重要な投資であり、いくつかのメモリ集約型のワークロードを可能にするだけでなく、インターネットコンピュータがコンテナにより大きな状態を提供できるようにします。
人工知能とオンチェーンでの大規模言語モデルの実行の文脈の中で、大データを操作するコンテナは特に興味深いものです。このようなコンテナは、大量のデータストレージだけでなく、I/Oスループットにも大きく依存しています。
さらに、これは、インターネットコンピュータの応答速度を向上させるために、より良い同時実行性を利用することによって、重要なパス上の重い作業を軽減するなど、今後の改善の基礎を築きます。原始的なストレージレイヤーの体験は、再リンクを避けることが重要であることを示しており、LSMTデータ構造はこれを実現できます。
この記事を楽しんでいただけましたか?DFINITY Developers Xチャンネルであなたの考えを共有し、明日私たちのStellaratorツアー第2部に参加してLuc Bläserとともにオーソリティの持続性を強化する方法を探りましょう。
あなたが気にかけているICの内容
技術の進展 | プロジェクト情報 | グローバルイベント
IC Binanceチャンネルをフォローする
最新情報を把握する