Fire-Flyer File System (3FS) は、DeepSeek によって開発されたパフォーマンス専有型分散ストレージシステムです。AI 大規模モデルトレーニング、ビッグデータ分析、ハイパフォーマンスコンピューティング (HPC) シナリオ向けに特別に設計および最適化されています。3FS は、最新の SSD ストレージと Remote Direct Memory Access (RDMA) を統合して、従来のネットワークパフォーマンスのボトルネックを克服します。このトピックでは、Alibaba Cloud elastic RDMA (eRDMA) 上で Elastic Compute Service (ECS) インスタンスに基づいて 3FS クラスターをデプロイする方法について説明します。このデプロイソリューションは、低レイテンシーかつ高スループットのデータ転送を実現し、AI トレーニングと大規模データ分析のパフォーマンス要件を満たします。
デプロイソリューション
Alibaba Cloud のパフォーマンス専有型 eRDMA 上でローカル SSD を搭載した i4 インスタンスファミリーの ECS インスタンスに基づいて 3FS クラスターを作成し、Alibaba Cloud AI Containers (AC2) を使用して安全で信頼性の高いコンテナー化されたアクセスソリューションを提供します。
Alibaba Cloud は、3FS の技術サポートを提供したり、3FS のデータ整合性、データの正確性、ソフトウェアの機能性、ソフトウェアのパフォーマンスを保証したりするものではありません。問題が発生した場合は、GitHub の 3FS コミュニティメンテナーにお問い合わせください。
eRDMA は、Alibaba Cloud がクラウド向けに開発した elastic Remote Direct Memory Access (RDMA) ネットワークです。eRDMA は、基盤となるリンクとして仮想プライベートクラウド (VPC) を再利用し、Alibaba Cloud が開発した輻輳制御 (CC) アルゴリズムを使用します。eRDMA は、RDMA サポートに基づく高スループットと低レイテンシーを特徴としています。RDMA と比較して、eRDMA は数秒以内に大規模な RDMA ネットワークを実装します。eRDMA は、従来の HPC アプリケーション、AI アプリケーション、および Transmission Control Protocol/Internet Protocol (TCP/IP) アプリケーションをサポートします。
詳細については、「eRDMA」をご参照ください。
i4 インスタンスファミリーは、Peripheral Component Interconnect Express (PCIe) Gen4 Non-Volatile Memory Express (NVMe) SSD と Cloud Infrastructure Processing Unit (CIPU) ローカルディスク仮想化アーキテクチャを使用します。この仮想化により、SSD の読み取りおよび書き込み帯域幅の減衰がほぼゼロになり、お客様に I/O レベルの O&M 監視機能が提供されます。詳細については、「ローカルディスクのカテゴリ」をご参照ください。
Alibaba Cloud AI Containers (AC2) は、Alibaba Cloud が提供する人工知能 (AI) コンテナイメージのコレクションです。AC2 には、さまざまなハードウェアアクセラレーションライブラリ、AI ランタイム、AI フレームワークが組み込まれており、さまざまなシナリオでのデプロイ要件を満たします。AC2 は Alibaba Cloud インフラストラクチャ向けに深く最適化されており、Alibaba Cloud 上でより優れた AI パフォーマンスとエクスペリエンスを提供します。
AC2 イメージの製造およびリリースプロセスでは、エンドツーエンドのセキュリティと信頼性が保証されます。AC2 イメージは、独自に選択されたソフトウェアを使用して構築され、共通脆弱性識別子 (CVE) 更新ポリシーとイメージセキュリティスキャンメカニズムが組み込まれているため、イメージのセキュリティが最大限に高められます。詳細については、「AC2 概要」をご参照ください。
重要このトピックで言及されているすべての 3FS コンポーネントは、AC2 イメージにプリビルドされています。独自にビルドする方法については、「3FS GitHub」をご参照ください。
AC2 イメージは無料で提供されます。ただし、イメージを使用する際に、vCPU、メモリ、ストレージ、パブリック帯域幅、スナップショットなどの他のリソースに対して課金される場合があります。
AC2 イメージを使用する前に、Docker ランタイム環境をセットアップする必要があります。以下では、コンテナーで eRDMA を有効にする方法について説明します。
コンテナー環境で eRDMA 機能を使用するには、Docker の
--deviceオプションを使用して、/dev/infiniband/rdma_cmおよび/dev/infiniband/uverbsXキャラクターデバイスをコンテナーにマッピングします。これにより、コンテナー内のユーザーモードプログラムがオペレーティングシステムのカーネルをバイパスして、eRDMA デバイスに直接アクセスしてデータを送受信できるようになります。/dev/infiniband/rdma_cm: eRDMA 接続管理用のキャラクターデバイス。ユーザーモードプログラムは、このキャラクターデバイスに対して操作を実行して、eRDMA デバイスとの接続を確立、破棄、および管理できます。これらの操作には、接続の作成と破棄、および接続イベントの送受信が含まれます。/dev/infiniband/uverbsX: ユーザースペース eRDMA 操作用のキャラクターデバイス。ユーザーモードプログラムは、このキャラクターデバイスに対して操作を実行して、eRDMA デバイスと通信できます。これらの操作には、デバイスのオープン、eRDMA 通信エンドポイントの作成と破棄、およびメモリバッファーの登録と登録解除が含まれます。説明/dev/infiniband/uverbsXでは、Xはデバイスインデックス番号であり、システムと構成によって異なる場合があります。ls /dev/infiniband | grep uverbsコマンドを実行して、キャラクターデバイス名を表示できます。
3FS の主要コンポーネント
以下では、3FS の主要コンポーネントとその機能について説明します。
メタデータサービス (meta): ファイルシステムのメタデータリクエストを処理するステートレスサービス。基盤となるレイヤーで FoundationDB を使用してアトミック操作を実装します。
ストレージサービス (storage): ストレージノードで実行され、データはパフォーマンス専有型 NVMe SSD 上にブロックで保存されます。Chain Replication with Apportioned Queries (CRAQ) プロトコルを使用してレプリカを管理し、write-all-read-any セマンティクスを提供します。
クラスターマネージャー (mgmtd): クラスター構成情報とストレージノードのステータスを管理し、プライマリノードの選出と他のコンポーネントへの更新の同期を担当します。
クライアント: 3FS は 2 種類のクライアントを提供します。Filesystem in Userspace (FUSE) クライアントを使用して標準アクセスを実装し、User Space Block I/O (USRBIO) クライアントを使用してパフォーマンス専有型伝送を実装できます。これにより、互換性と効率性のバランスが取れ、3FS は AI およびビッグデータシナリオに最適なストレージインターフェイスになります。
FUSE クライアント: ユーザースペースファイルシステムインターフェイスを使用して、ストレージクラスターをローカルディレクトリとしてマウントします。アプリケーションコードを変更することなく、Portable Operating System Interface (POSIX) と互換性のあるファイル操作インターフェイス (
read、write、mkdir) を提供します。USRBIO クライアント: ユーザースペース I/O スタックと RDMA を使用してマイクロ秒レベルのレイテンシーと超高スループットを実現し、AI と HPC の要件を満たします。
すべてのコンポーネントは、RDMA を介して相互に通信し、カーネルプロトコルスタックをバイパスします。これにより、CPU 負荷とネットワーク遅延が大幅に削減されます。
デプロイ例
この例では、g8i 汎用インスタンスファミリーの ecs.g8i.48xlarge インスタンスを meta ノードとして使用します。meta サービス、クラスターマネージャー (mgmtd)、クライアント、およびモニターサービスは、meta ノードにデプロイされます。ローカル SSD を搭載した i4 インスタンスファミリーの 5 つの ecs.i4.32xlarge インスタンスが、パフォーマンス専有型 NVMe SSD を提供するためのストレージノードとして使用されます。eRDMA は各ノードで構成され、eRDMA 通信を可能にし、3FS クラスターのデプロイを完了します。すべての ECS インスタンスは、同じ VPC とゾーンに存在します。
プロセスを簡素化するために、この例ではメタデータサービス (meta)、クラスターマネージャー (mgmtd)、クライアント、およびモニターコンポーネントを単一のノードにデプロイします。本番環境では、ビジネスの規模と高可用性の要件に基づいて、サービスのデカップリングとリソースの隔離のためにマルチノード分散アーキテクチャを使用することをお勧めします。
ステップ 1: 環境の準備
3FS クラスターノードをデプロイするための ECS インスタンスを準備し、インスタンスで eRDMA を構成します。
meta ノードとクライアントノードとして機能する ECS インスタンスを 1 つ作成し、ストレージノードとして機能する ECS インスタンスを 5 つ作成します。すべてのノードは、内部ネットワークを介して相互に通信できます。すべてのノードは、AC2 イメージリソースをダウンロードするためにインターネットにアクセスできます。
作成中に、すべての ECS インスタンスについて次のパラメーターに注意してください。他のパラメーターについては、「[カスタム起動] タブでインスタンスを作成する」をご参照ください。
リージョン: この例では、中国 (杭州) リージョンが使用されます。
インスタンスタイプ: eRDMA をサポートするインスタンスタイプを選択します。
Meta ノード: ecs.g8i.48xlarge
ストレージノード: ecs.i4.32xlarge
イメージ: eRDMA をサポートする Ubuntu 22 イメージを選択します。
eRDMA インターフェイス (ERI): インスタンス上の Elastic Network Interface (ENI) の ERI を有効にして、eRDMA 通信モードを有効にします。
重要この例の IP アドレスは、ERI が有効になっている ENI のプライマリプライベート IP アドレスです。この例では、各インスタンスのプライマリ ENI で ERI が有効になっています。セカンダリ ENI で RDMA 通信をテストする場合は、それに応じて IP アドレスを変更してください。

ステップ 2: meta ノードのデプロイ
meta ノードとして使用されるインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
eRDMA ドライバーをインストールします:
curl -O http://mirrors.cloud.aliyuncs.com/erdma/env_setup.sh sudo /bin/bash env_setup.sh > /var/log/erdma_install.log 2>&1スクリプトは、必要な依存関係を自動的にインストールし、次に eRDMA ドライバーをインストールします。スクリプトの実行が完了するまで待ちます。
eRDMA が正しく構成されているかどうかを確認します:
ibv_devinfo次のコマンド出力は、インスタンスで eRDMA が正しく有効になっていることを示します (eRDMA ドライバーが正しくインストールされ、ERI が正しく構成されています)。eRDMA ドライバーのインストールプロセスには、完了までに時間がかかります。エラーが返された場合は、「eRDMA 構成の正しさを確認する」をご参照ください。

RDMA 接続モードを互換モードに設定します。
重要デフォルトでは、eRDMA をサポートする CPU ベースのインスタンスファミリーは、eRDMA カーネルモードドライバーを標準モードでインストールします。このモードでは、RDMA_CM 接続確立方式のみがサポートされます。
eRDMA は、アウトオブバンド (OOB) シナリオ向けに互換モードを提供します。互換モードでは、30608 から 30623 の範囲の 16 個の TCP ポートが追加で占有されます。
sudo sh -c "echo 'options erdma compat_mode=Y' >> /etc/modprobe.d/erdma.conf" sudo rmmod erdma sudo modprobe erdma compat_mode=YDocker をインストールします。
説明AC2 イメージを使用する前に、Docker ランタイム環境をセットアップする必要があります。Docker のインストール手順は、オペレーティングシステムによって異なります。詳細については、「Docker と Docker Compose のインストールと使用」をご参照ください。この例では、Ubuntu が使用されます。
apt update apt install docker.io -yインストールが完了したら、次のコマンドを実行して Docker のバージョンを表示し、Docker がインストールされているかどうかを確認します。

ClickHouse をデプロイして起動し、ノードステータス、リソース使用率、I/O などのクラスターのランタイムメトリックを永続化します:
docker run -d --net=host --name clickhouse-server --ulimit nofile=262144:262144 ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/clickhouse:25.3.1.2703-ubuntu22.04--net=host: コンテナーの通信モードをhostに設定します。コンテナー内のアプリケーションは、ホストのネットワークインターフェイスとネットワーク構成を直接使用できます。これにより、ホストと同じネットワーク通信機能が提供されます。--ulimit nofile: コンテナー内のプロセスのファイル記述子の制限を指定します。これは、プロセスが同時に開くことができるファイルの最大数です。これにより、プロセスによる過剰なファイルハンドル使用によるシステムの不安定化を防ぎます。
FoundationDB をデプロイして起動し、クラスタートランザクションログの設定とデータを保存します:
docker run -d --network=host --name fdb ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/fdb:7.3.63-ubuntu22.043FS モニターをデプロイして起動し、スループット、レイテンシー、リソース使用量など、システム実行中のさまざまなメトリックを収集および分析します:
docker run -d --network=host --name monitor --ulimit memlock=-1 --privileged --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/3fs:b71ffc55-fdb7.3.63-fuse3.16.2-ubuntu22.04 ./monitor.sh--ulimit memlock=-1:maxlockedmemoryをunlimitedに設定します。これは、非 root ユーザーがロックできるメモリ量に制限がないことを意味します。これにより、eRDMA アプリケーションが非 root ユーザーによって実行されたときに必要なメモリ量をロックでき、eRDMA 機能を効果的に使用できるようになります。--device=/dev/infiniband/uverbsXおよび--device=/dev/infiniband/rdma_cm: eRDMA ユーザーモードキャラクターデバイスをコンテナーに公開します。次のコマンドを実行して、キャラクターデバイス名 (
uverbsXの X) を表示します:ls /dev/infiniband | grep uverbs
3FS クラスターマネージャー (mgmtd) をデプロイして起動し、クラスター内のストレージノードとリソース割り当てを管理します:
docker run -d --network=host --name mgmtd --ulimit memlock=-1 --privileged --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm --env FDB_CLUSTER=`docker exec fdb cat /etc/foundationdb/fdb.cluster` --env REMOTE_IP="172.16.20.172:10000" --env MGMTD_SERVER_ADDRESSES="RDMA://172.16.20.172:8000" ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/3fs:b71ffc55-fdb7.3.63-fuse3.16.2-ubuntu22.04 ./mgmtd.sh--env REMOTE_IP: モニターサービスのアドレスを指定します。これは、サービスが存在するノードのプライマリプライベート IP アドレスです。この例では、サービスは meta サービスと同じノードに存在します。--env MGMTD_SERVER_ADDRESSES: mgmtd サービスのアドレスを指定します。これは、サービスが開始されるノードのプライマリプライベート IP アドレスです。この例では、サービスは meta サービスおよびモニターサービスと同じノードに存在します。
3FS メタデータサービス (meta) をデプロイして起動します:
docker run -d --network=host --name meta --ulimit memlock=-1 --privileged --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm --env FDB_CLUSTER=`docker exec fdb cat /etc/foundationdb/fdb.cluster` --env META_NODE_ID=100 --env REMOTE_IP="172.16.20.172:10000" --env MGMTD_SERVER_ADDRESSES="RDMA://172.16.20.172:8000" ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/3fs:b71ffc55-fdb7.3.63-fuse3.16.2-ubuntu22.04 ./meta.sh--env META_NODE_ID: meta ノードのシーケンシャル番号を指定します。この例では、1 つの meta ノードが使用され、そのシーケンシャル番号は 100 に設定されます。--env REMOTE_IP: モニターサービスのアドレスを指定します。これは、サービスが存在するノードのプライマリプライベート IP アドレスです。この例では、サービスは meta サービスと同じノードに存在します。--env MGMTD_SERVER_ADDRESSES: mgmtd サービスのアドレスを指定します。これは、サービスが開始されるノードのプライマリプライベート IP アドレスです。この例では、サービスは meta サービスおよびモニターサービスと同じノードに存在します。
開始されたノードサービス (Docker コンテナー) を表示します:
docker ps
ステップ 3: ストレージノードのデプロイ
5 つのストレージノードのそれぞれで次の手順を実行します:
ストレージノードとして使用されるインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
eRDMA ドライバーをインストールします:
curl -O http://mirrors.cloud.aliyuncs.com/erdma/env_setup.sh sudo /bin/bash env_setup.sh > /var/log/erdma_install.log 2>&1スクリプトは、必要な依存関係を自動的にインストールし、次に eRDMA ドライバーをインストールします。スクリプトの実行が完了するまで待ちます。
eRDMA が正しく構成されているかどうかを確認します:
ibv_devinfo次のコマンド出力は、インスタンスで eRDMA が正しく有効になっていることを示します (eRDMA ドライバーが正しくインストールされ、ERI が正しく構成されています)。eRDMA ドライバーのインストールプロセスには、完了までに時間がかかります。エラーが返された場合は、「eRDMA 構成の正しさを確認する」をご参照ください。

RDMA 接続モードを互換モードに設定します。
重要デフォルトでは、eRDMA をサポートする CPU ベースのインスタンスファミリーは、eRDMA カーネルモードドライバーを標準モードでインストールします。このモードでは、RDMA_CM 接続確立方式のみがサポートされます。
eRDMA は、アウトオブバンド (OOB) シナリオ向けに互換モードを提供します。互換モードでは、30608 から 30623 の範囲の 16 個の TCP ポートが追加で占有されます。
sudo sh -c "echo 'options erdma compat_mode=Y' >> /etc/modprobe.d/erdma.conf" sudo rmmod erdma sudo modprobe erdma compat_mode=YNVMe SSD をフォーマットしてマウントします。この例では、ストレージノード上の 8 つのローカルディスクがマウントされ、eXtensible File System (XFS) ファイルシステムにフォーマットされます。XFS ファイルシステムは高いパフォーマンスを提供し、大容量ファイルに適しています。
mkdir -p /storage/data{0..7} for i in {0..7};do mkfs.xfs -L data${i} /dev/nvme${i}n1;mount -o noatime,nodiratime -L data${i} /storage/data${i};done; mkdir -p /storage/data{0..7}/3fsマウントが完了したら、次のコマンドを実行してパーティションのステータスを確認します。

Docker をインストールします。
説明AC2 イメージを使用する前に、Docker ランタイム環境をセットアップする必要があります。Docker のインストール手順は、オペレーティングシステムによって異なります。詳細については、「Docker と Docker Compose のインストールと使用」をご参照ください。この例では、Ubuntu が使用されます。
apt update apt install docker.io -yインストールが完了したら、次のコマンドを実行して Docker のバージョンを表示し、Docker がインストールされているかどうかを確認します。

ストレージサービス (storage) を開始します:
docker run -d --network=host --name storage --ulimit memlock=-1 --privileged -v /storage:/storage --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm --env STORAGE_NODE_ID=10001 --env TARGET_PATHS="/storage/data0/3fs","/storage/data1/3fs","/storage/data2/3fs","/storage/data3/3fs","/storage/data4/3fs","/storage/data5/3fs","/storage/data6/3fs","/storage/data7/3fs" --env REMOTE_IP="172.16.20.172:10000" --env MGMTD_SERVER_ADDRESSES="RDMA://172.16.20.172:8000" ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/3fs:b71ffc55-fdb7.3.63-fuse3.16.2-ubuntu22.04 ./storage.sh--device=/dev/infiniband/uverbsXおよび--device=/dev/infiniband/rdma_cm: eRDMA ユーザーモードキャラクターデバイスをコンテナーに公開します。次のコマンドを実行して、キャラクターデバイス名 (
uverbsXの X) を表示します:ls /dev/infiniband | grep uverbs
--env STORAGE_NODE_ID: ストレージノードのシーケンシャル番号を指定します。5 つのストレージノードの場合、番号はそれぞれ 10001、10002、10003、10004、10005 です。値を実際の番号に置き換えてください。--env TARGET_PATHS: 3FS のストレージディレクトリを指定します。この例では、前の手順でローカルディスクに作成されたディレクトリが使用されます。--env REMOTE_IP: モニターサービスのアドレスを指定します。これは、サービスが存在するノードのプライマリプライベート IP アドレスです。この例では、サービスは meta サービスと同じノードに存在します。--env MGMTD_SERVER_ADDRESSES: mgmtd サービスのアドレスを指定します。これは、サービスが開始されるノードのプライマリプライベート IP アドレスです。この例では、サービスは meta サービスおよびモニターサービスと同じノードに存在します。
開始されたノードサービス (Docker コンテナー) を表示します:
docker ps
ステップ 4: meta ノードで接続されているストレージノードを表示する
meta ノードとして使用されるインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
meta ノードに接続されているノードのステータスを表示します:
docker exec -it meta /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://172.16.20.172:8000"]' "list-nodes"IP アドレスを mgmtd サービスの IP アドレスに置き換えます。

admin_cliは、3FS を管理および保守するためのコマンドラインツールです。クラスター構成、ステータス監視、トラブルシューティングに使用できます。詳細については、次のコマンドを実行してください:docker exec -it meta /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://172.16.20.172:8000"]' "help"
ステップ 5: meta ノードでストレージノード関連のパラメーターを設定する
レプリカ数やストレージノードあたりのディスク数など、ストレージノード関連の情報を構成します。
meta ノードとして使用されるインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
3FS を構成します:
docker exec \ --env STORAGE_NODE_NUM=5 \ --env STORAGE_NODE_BEGIN=10001 \ --env STORAGE_NODE_END=10005 \ --env REPLICATION_FACTOR=3 \ --env NUM_DISKS_PER_NODE=8 \ --env MGMTD_SERVER_ADDRESSES="RDMA://172.16.20.172:8000" \ meta \ ./config_3fs.sh--env STORAGE_NODE_NUM: ストレージノードの数を指定します。この例では 5 です。--env STORAGE_NODE_BEGIN: ストレージノードの開始シーケンシャル番号を指定します。この例では 10001 です。--env STORAGE_NODE_END: ストレージノードの終了シーケンシャル番号を指定します。この例では 10005 です。--env REPLICATION_FACTOR: 保存されたデータのレプリカ数を指定します。この例では 3 が使用され、3 つのレプリカを示します。--env NUM_DISKS_PER_NODE: ストレージノードあたりのディスク数を指定します。この例では 8 です。--env MGMTD_SERVER_ADDRESSES: mgmtd サービスのアドレスを指定します。--env NUM_TARGETS_PER_DISK: 物理ディスクごとに作成が期待されるストレージターゲットの数を指定します。デフォルト値: 12。これは、各 SSD が 12 のストレージターゲットに分割されることを示します。--env MIN_TARGETS_PER_DISK: 物理ディスクごとに許可されるストレージターゲットの最小数を指定します。デフォルト値: 12。これは、各 SSD が少なくとも 12 の利用可能なストレージターゲットを維持する必要があることを示します。
config_3fs.shスクリプトは次の操作を実行します:root管理者を作成し、認証トークンを生成します。トークンは、後続の操作を認証するために/opt/3fs/etc/token.txtに保存されます。STORAGE_NODE_NUMやREPLICATION_FACTORなどの入力パラメーターに基づいてデータ分布ポリシーが生成されます。次に、このポリシーからチェーン化されたストレージテーブルが生成され、管理サーバーmgmtdにアップロードされて、ストレージノードのターゲットとチェーン構造がデプロイされます。
次のコマンドを実行して、チェーンが作成され、そのステータスが正常であることを確認します。
docker exec -it meta /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://172.16.20.172:8000"]' "list-chains"IP アドレスを、構成された
mgmtdサービスのアドレスに置き換えます。次の図は、チェーン情報を示しています。後続の FIO テストでは、チェーンのステータスが正常である必要があります。

ステップ 6: FUSE クライアントを設定する
meta ノードで FUSE クライアントを構成して、リモートストレージをマウントし、ローカルシステムで操作しているかのようにファイル操作を実行できるようにします。
meta ノードとして使用されるインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
安全なクライアントアクセスを確保するためにトークンを取得します:
docker exec meta cat /opt/3fs/etc/token.txtFUSE クライアントを起動します:
docker run -d --network=host --name fuse --shm-size=200g --ulimit memlock=-1 --privileged \ --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm \ --env REMOTE_IP="172.16.20.172:10000" \ --env MGMTD_SERVER_ADDRESSES="RDMA://172.16.20.172:8000" \ --env TOKEN=${token} \ ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/3fs:b71ffc55-fdb7.3.63-fuse3.16.2-ubuntu22.04 \ ./fuse.sh--shm-size: コンテナー内の/dev/shm共有メモリ領域のサイズを指定します。FUSE を使用する場合、
--shm-sizeパラメーターを 2g などのより小さい値に設定できます。USRBIO を使用する場合、テストプロセスはゼロコピーを実現するために、共有メモリを使用して FUSE プロセスと I/O バッファーを共有する必要があります。
--shm-sizeパラメーターの値を 200g などに増やすことをお勧めします。
--device=/dev/infiniband/uverbsXおよび--device=/dev/infiniband/rdma_cm: eRDMA ユーザーモードのキャラクターデバイスをコンテナーに公開します。次のコマンドを実行して、キャラクターデバイス名 (
uverbsXの X) を表示します:ls /dev/infiniband | grep uverbs
--env REMOTE_IP: モニターサービスのアドレスを指定します。これは、サービスが存在するノードのプライマリプライベート IP アドレスです。この例では、サービスは meta サービスと同じノードに存在します。--env MGMTD_SERVER_ADDRESSES: mgmtd サービスのアドレスを指定します。これは、サービスが開始されるノードのプライマリプライベート IP アドレスです。この例では、サービスは meta およびモニターサービスと同じノードに存在します。--env TOKEN: 前のステップで取得したトークン文字列を指定します。
開始されたノードサービス (Docker コンテナー) を表示します:
docker ps
FUSE コンテナー内のファイルシステムのマウント情報とディスク使用量を表示します:
docker exec fuse df -hT | grep 3fs
fio を使用したパフォーマンステスト
クラスターのデプロイが完了すると、FUSE コンテナーには、ノード間通信に eRDMA を使用する 3FS ベースのパフォーマンス専有型分散ファイルシステムができます。
Flexible I/O tester (fio) は、ハードドライブ、SSD、分散ファイルシステムなどのストレージシステムの I/O 機能を評価するために設計されたオープンソースのストレージパフォーマンスベンチマークツールです。その中心的な価値は、実際のビジネスシナリオの負荷モデルをシミュレートし、高度に構成可能なテストパラメーターを使用して、スループット、IOPS、レイテンシーなどのストレージデバイスの主要なパフォーマンスメトリックを正確に定量化する能力にあります。
次のセクションでは、fio を使用して、デプロイされた 3FS ファイルシステムでパフォーマンステストを実行する方法について説明します。
USRBIO (ユーザースペース RDMA エンジン) の使用
FUSE コンテナーで、100 個のジョブを開始して、高同時実行性、大容量ファイルのシーケンシャル書き込みシナリオをシミュレートし、eRDMA ネットワーク上での 3FS の極限のパフォーマンスをテストします。hf3fs_usrbio.so エンジンは、ユーザースペース RDMA 通信を可能にし、ゼロコピー RDMA 最適化を実現し、カーネルスペース FUSE と比較して大幅なパフォーマンス向上を実現します。
meta ノードとして使用されるインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
テストを開始します:
docker exec -it fuse \ fio -numjobs=100 -fallocate=none \ -ioengine=external:/usr/lib/hf3fs_usrbio.so \ -direct=1 \ -rw=write \ -bs=4MB \ --group_reporting \ -filesize=500MB \ --nrfiles=100 \ -iodepth=1 \ -name=/3fs/test \ -mountpoint=/3fs \ -ior_depth=1-numjobs=100: 100 の同時ジョブ (スレッドまたはプロセス) を開始して、マルチスレッドの同時書き込みシナリオをシミュレートし、高同時実行性下でのシステムのスループットとロック競合をテストします。-ioengine=external:/usr/lib/hf3fs_usrbio.so: 3FS 固有の RDMA エンジンを使用します。-direct=1: ダイレクト I/O を有効にして、オペレーティングシステムのキャッシュをバイパスします。-rw=write: テストモードをシーケンシャル書き込み (大容量ファイルのシーケンシャル書き込み) に設定して、連続書き込み帯域幅を評価します。-bs=4M: ブロックサイズを 4 MB に設定し、ビデオストリームやバッチデータ処理などの大ブロックデータ書き込みシナリオをシミュレートします。--group_reporting: 個々のジョブデータを表示するのではなく、全体的なパフォーマンスを簡単に表示できるように、すべてのジョブの結果をマージして要約します。-filesize=500MB: 各ジョブが 500 MB のデータを書き込むように指定します。合計データ量は 500 MB × 100 ジョブ = 50 GB です。--nrfiles=100: 合計 100 個のファイルを作成し (各ジョブが 1 つのファイルに書き込みます)、複数ファイルの同時書き込みパフォーマンスをテストします。-iodepth=1: 各ジョブの I/O キューの深さを 1 に設定します。これは、各ジョブが 1 つの I/O リクエストのみを送信することを指定します。-mountpoint=/3fs: 3FS ファイルシステムのマウントポイントを/3fsディレクトリに設定します。-ior_depth=1: RDMA 送信 (Tx) キューの深さを指定します。この例では 1 が使用され、同期 I/O モードを指定します。
テスト中に、FUSE コンテナーが存在するインスタンスの監視ページを開き、eRDMA トラフィックを確認します。詳細については、「ネットワーク帯域幅の監視」をご参照ください。

テストが完了するのを待って、テスト結果を表示します。

主要メトリックのテスト結果:
スループット:
IOPS=2621: 毎秒 2,621 回の 4 MB 書き込み操作。BW=10.2GiB/s (11.0GB/s): 実際のテスト帯域幅は 10.2 GiB/s に達します。
システムリソース消費:
cpu: usr=1.21%, sys=0.02%: 超低 CPU 使用率 (eRDMA の大きな利点)。
POSIX (カーネルスペース libaio エンジン) の使用
FUSE コンテナーで、Linux 非同期 I/O エンジンを使用して 2 つのジョブを開始し、同時書き込みをシミュレートし、4 MB のデータブロックを注入してシーケンシャル書き込みシナリオの帯域幅をテストし、テストを 5 分間継続して 3FS の安定性をテストします。
meta ノードとして使用されるインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
テストを開始します:
docker exec -it fuse \ fio -numjobs=2 -fallocate=none \ -iodepth=2 \ -ioengine=libaio \ -direct=1 \ -rw=write \ -bs=4M \ --group_reporting \ -size=100M \ -time_based \ -runtime=300 \ -name=2depth_128file_4M_direct_write_bw \ -directory=/3fs-numjobs=2: 2 つの同時ジョブ (スレッドまたはプロセス) を開始して、マルチスレッドの同時書き込みシナリオをシミュレートし、高同時実行性下でのシステムのスループットとロック競合をテストします。-iodepth=2: 各ジョブの I/O キューの深さを 2 に設定します。これは、各ジョブが同時に 2 つの I/O リクエストを送信することを指定します。-ioengine=libaio: Linux 非同期 I/O エンジン (libaio) を使用します。これは、非ブロッキング I/O をサポートします。-direct=1: ダイレクト I/O を有効にして、オペレーティングシステムのキャッシュをバイパスします。-rw=write: テストモードをシーケンシャル書き込み (大容量ファイルのシーケンシャル書き込み) に設定して、連続書き込み帯域幅を評価します。-bs=4M: ブロックサイズを 4 MB に設定し、ビデオストリームやバッチデータ処理などの大ブロックデータ書き込みシナリオをシミュレートします。--group_reporting: 個々のジョブデータを表示するのではなく、全体的なパフォーマンスを簡単に表示できるように、すべてのジョブの結果をマージして要約します。-size=100M: 各ジョブが 100 MB のデータを書き込むように指定します (合計データ量 = 100 MB × 2 ジョブ = 200 MB)。-time_basedおよび-runtime=300: ジョブを 300 秒 (5 分) 間実行するように設定します。ジョブは、期間が終了する前に指定された量のデータを書き込んだ場合でも、テスト期間全体にわたって実行を継続し、長期的な書き込みの安定性をテストします。-directory=/3fs: 3FS ファイルシステムのマウントポイントを/3fsディレクトリに設定します。
テスト中に、FUSE コンテナーが存在するインスタンスの監視ページを開き、eRDMA トラフィックを確認します。詳細については、「ネットワーク帯域幅の監視」をご参照ください。

テストが完了するのを待って、テスト結果を表示します。

主要メトリックのテスト結果:
スループット:
IOPS=715: 毎秒 715 回の 4 MB 書き込み操作 (715 × 4 MB = 2,860 MB/s)。BW=2862MiB/s (3001MB/s): 実際の帯域幅は 2.795 GB/s に達します。
システムリソース消費:
cpu: usr=18.66%, sys=2.55%: 高いユーザースペース CPU 使用率 (libaio エンジンのオーバーヘッド)。