- FUSEは、カーネルモジュールなしでファイルシステムドライバーを作成できるようにする
- NTFS、SFTP、S3のようなさまざまなファイルシステムクライアントで使われている
- WikipediaFSのように、実際のファイルシステムではないものも作れる
- しかし、FUSEは開発しづらい
- 2つのAPIから選択する必要がある: Low-Level と High-Level
- 互換性のない2つのAPIバージョン: libfuse2 と libfuse3
- 少しずつ変わり続けるAPI群 (
FUSE_USE_VERSION)
- Mac と Windows ではネイティブではなく、MacFuse や WinFuse のようなサードパーティ製ドライバーをインストールしなければならない
- 私たち(XetHub)は、S3コマンドを使わなくても、画像データセットのさまざまなバージョンに個人のノートPCから手軽にアクセスできるようにしたかった
- 「真にクロスプラットフォームなユーザースペースファイルシステムを作れるだろうか?」という問いから NFSv3 にたどり着いた
NFS
- NFSv3は20年前からあるネットワークファイルシステムプロトコルで、非常にシンプルかつ普遍的なため、ほぼすべてのOSに標準実装されている
- 美しくシンプルな設計原則
- サーバーは完全にステートレス
- NFSサーバーは単純で、NFSクライアントは賢い
- シンプルなキャッシュ整合性ルール(サーバーはキャッシュポリシーを定義せず、クライアントが必要なだけ判断する)
- NFSクライアントは、自分がネットワーク越しに対話していることを理解している
- 実際に非常に優れた性能
- 要するに、FUSEの代わりにローカルホストNFSを使ってユーザーモードのファイルシステムを実装すれば、性能と回復性(resiliency)をより簡単に得られるということ
- サーバープロトコルを一度実装すれば、既存のキャッシュ機構や20年かけて強化されてきた機能をそのまま活用できる
XetHub でのNFSの使い方
- ネイティブなクロスプラットフォーム対応のユーザーモードファイルシステム実装を開発
- カーネルドライバーなしで大規模データセットをユーザーのマシンにマウント可能
- 660GB の Llama 2 モデルをマウントしたり、DuckDB のクエリで大規模な Parquet ファイルを分析したりできる
- Linux、Mac、および Windows Pro 以上で対応(Windows Home では動作しない)
- Rust で実装したNFSサーバー nfsserve をGitHubで公開
- 読み取り性能はかなり良好で、書き込みも動作するが、まだ最適化が必要
4件のコメント
タイトルとは違って、肝心のRustで書いた理由は載っていませんね。
元記事の焦点は、独自のNFSサーバーを開発した理由……なのですが、Rustのような人気キーワードを外せないので、タイトルに入れたようですね :-)
元記事はRustで書いた理由ではなく、FUSEの代わりにNFSを選んだ理由についての内容ですね。
あっ、そういえば単にRustだから速いという話以外は何もなかったですね。あまり考えずに要約してしまいました。