Lustre

Definition:

Lustreとは、大規模並列計算環境やスーパーコンピュータ向けに開発された分散並列ファイルシステムである。多数の計算ノードから単一のファイルシステムとして利用できるよう設計されており、数百GB/sから数TB/s級のスループットを実現できることを特徴とする。Linuxカーネル上で動作し、科学技術計算、高性能計算(HPC)、人工知能(AI)、機械学習、大規模シミュレーションなどの分野で広く利用されている。

一般的なネットワークファイルシステムが複数のクライアントによる共有を主目的としているのに対し、Lustreは数万台規模のノードが同時に同一ファイルへアクセスすることを前提として設計されている。そのため、単なる共有ストレージではなく、並列計算環境におけるデータ供給基盤としての役割を担う。

Lustreという名称はLinuxClusterを組み合わせた造語であり、その名称が示すようにLinuxクラスタ向けの高性能ファイルシステムとして誕生した。

小史

1990年代後半から2000年代初頭にかけて、スーパーコンピュータの性能は急速に向上した。しかし計算能力の向上に対してストレージ性能の向上が追いつかず、I/Oがシステム全体のボトルネックとなる現象が顕在化した。当時広く利用されていたNFSやNAS型ストレージは、多数の計算ノードによる同時アクセスを想定していなかったため、大規模並列計算環境では十分な性能を発揮できなかった。

こうした背景のもと、Lustreの開発はカーネギーメロン大学(CMU)に在籍していたピーター・ブラーム(Peter Braam)によって1999年に研究プロジェクトとして開始された。BraamはCMUのCodaプロジェクトにおけるInterMezzoファイルシステムの研究成果をもとに、2001年にCluster File Systems社を設立し、商用開発へと移行した。開発には米国エネルギー省のASCI(Accelerated Strategic Computing Initiative)Path Forwardプログラムの資金援助を受け、Hewlett-PackardとIntelも参画した。最初の本番環境への導入は2003年3月、ローレンスリバモア国立研究所のMCR Linuxクラスタで行われた。

その後、開発主体は複数回変更されている。2007年9月にはSun MicrosystemsがCluster File Systemsの資産と知的財産を買収し、LustreをSunの高性能計算ハードウェア製品群に組み込んだ。さらに2010年にはSun MicrosystemsがOracle Corporationに買収され、LustreもOracleの管理下に置かれた。

しかし同年12月、OracleはLustre 2.x系の開発中止と1.8系のメンテナンスのみへの移行を発表した。これを受けてLustreのコミュニティは危機感を抱き、Oracleを離れた開発者らがWhamcloudというソフトウェアスタートアップを設立してLustreの開発を継続した。並行して、Cray・DDN・ローレンスリバモア国立研究所・オークリッジ国立研究所などの連合体によってOpenSFS(Open Scalable File Systems)が2010年に設立され、Lustreがベンダー中立かつオープンソースであり続けることを保証するコミュニティ主導の開発体制が整備された。

現在では世界中のスーパーコンピュータで採用されており、TOP100システムの60%以上で利用されている。日本のスーパーコンピュータ およびその後継である 富岳(富士通が独自拡張したLustreベースのFEFS:Fujitsu Exabyte File Systemを採用)、富岳が登場する前まで、世界ランキング(TOP500)で1位を誇っていたアメリカのSummitや、Summitの後継機で2022年に稼働したFrontierを含む多数の大規模システムで利用されている。

基本アーキテクチャ

Lustreの最大の特徴は、構成管理・メタデータ管理・データ格納をそれぞれ独立したサーバへ分離していることである。

通常のファイルシステムでは、ファイル名やディレクトリ情報と実際のデータが同じストレージシステム内で管理される。しかしLustreではこれらを別々のサーバに分散させる。

ファイルシステム全体の構成情報(どのサーバが何を担当するかなど)を管理するサーバをManagement Server(MGS)と呼ぶ。クライアントおよびすべてのサーバは起動時にMGSへ接続し、ファイルシステムの構成情報を取得する。

ファイル名や属性情報を管理するサーバをMetadata Server(MDS)と呼ぶ。実際のファイルデータを格納するサーバをObject Storage Server(OSS)と呼ぶ。

クライアントがファイルを開く際にはまずMDSへ問い合わせを行い、その後OSSへ直接アクセスする。この構造によってメタデータ処理とデータ転送処理を並列化できるため、大規模環境において高いスケーラビリティを実現できる。

メタデータ管理

Lustreではファイルの名前、所有者、パーミッション、ディレクトリ構造などをMDSが管理する。メタデータそのものはMetadata Target(MDT)と呼ばれるストレージ領域に格納される。

ファイル作成、ディレクトリ検索、ファイル削除、属性取得といった操作は主にMDSで処理される。一方で、ファイルの内容そのものはMDSを経由しない。この分離によって大量のデータ転送が発生してもメタデータ処理への影響を最小化できる。

オブジェクトストレージ構造

LustreではファイルデータをObject Storage Target(OST)と呼ばれる領域へ保存する。従来のファイルシステムでは一つのファイルは一つのディスクに格納されることが多いが、Lustreでは巨大なファイルを複数のOSTへ分散配置する。

例えば100GBのファイルを保存する場合、OST1・OST2・OST3・OST4へ25GBずつ配置することができる。この方式をストライピング(Striping)と呼ぶ。ストライピングによって複数のOSSから並列にデータを取得できるため、単一ストレージの性能限界を超えるスループットが得られる。

ファイルアクセスの流れ

クライアントがファイルを読み込む場合、まずMDSへ接続して対象ファイルのメタデータを取得する。MDSはどのOSTにデータが存在するかおよびストライプサイズはいくつかという情報を返す。その後クライアントは各OSSへ直接アクセスする。仮に8個のOSTへ分散されたファイルであれば、8本の並列ストリームによってデータが転送される。結果として単一ストレージでは不可能な帯域幅を実現できる。

ロック機構

大規模環境では複数ノードが同一ファイルへ同時アクセスする。この問題を解決するため、LustreはDistributed Lock Manager(DLM)を採用している。ロックは中央集権的ではなく分散的に管理される。クライアントはキャッシュを積極的に利用しながら、必要に応じてロック状態を調整する。これにより整合性を維持しつつ高い性能を実現している。

ネットワーク層

LustreはLNet(Lustre Networking)と呼ばれる独自通信層を備えている。LNetはネットワーク抽象化レイヤとして機能し、異なるインターコネクト上で同一のファイルシステムを利用できる。対応するネットワーク技術にはInfiniBandOmni-PathEthernetCray Interconnectなどがある。特にスーパーコンピュータ環境ではInfiniBandとの組み合わせが一般的であり、低遅延かつ高帯域のデータ転送を実現している。また、InfiniBandRoCE(RDMA over Converged Ethernet)が対応している場合はRDMA(Remote Direct Memory Access)も利用でき、CPUを介さないデータ転送によってさらなる低遅延化を実現できる。

AI時代におけるLustre

Lustreの利用領域は従来の科学技術計算だけにとどまらない。大規模言語モデルの学習では数百TBから数PB規模の学習データを多数のGPUへ供給する必要があり、GPU・ネットワーク・ストレージというデータ供給経路の性能がボトルネックになる。Lustreは大規模並列I/O性能を備えているため、AI学習クラスタにおいても利用されることが増えている。

もっとも、AIワークロードでは、小規模ファイルが大量に存在するケースやランダムアクセスが支配的なケースも多く、そうした用途ではオブジェクトストレージや分散キャッシュシステムと併用されることが多い。

サンプルコード

Lustre自体はカーネルレベルのファイルシステムであるため、アプリケーションからは通常のPOSIXファイルシステムとして利用できる。

以下はPythonからLustre上のファイルを、ファイルをバイナリモードで並列に読み込む例である。

from multiprocessing import Pool

def read_file(path):
with open(path, "rb") as f:
return len(f.read())

files = [
"/lustre/data/file1.bin",
"/lustre/data/file2.bin",
"/lustre/data/file3.bin",
"/lustre/data/file4.bin"
]

with Pool(processes=4) as pool:
results = pool.map(read_file, files)

print(results)

MPIを利用するHPC環境では、MPI-IOと組み合わせることでLustreの並列I/O性能を最大限活用できる。

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

filename = "/lustre/data/output.bin"

with MPI.File.Open(
comm,
filename,
MPI.MODE_CREATE | MPI.MODE_WRONLY
) as f:

offset = rank * 1024
data = bytes([rank]) * 1024

f.Write_at(offset, data)

comm.Barrier()

このように各プロセスが異なるオフセットへ同時に書き込むことで、Lustreのストライピング機構と並列I/O機構を活用した高速なデータ処理が可能となる。

Mathematics is the language with which God has written the universe.





















MPI-IO DSPy OKF Haskell ルーティングテーブル プレーン