GCP に Lustre Parallel File System をデプロイする

1. 概要

Google Cloud Platform で Lustre 並列ファイル システム クラスタを実行するための Google Codelab へようこそ。

d51beef5f729cbe9.png

データはハイ パフォーマンス コンピューティングの実践の中核であり、大量のデータに超高速かつ低レイテンシでアクセスすることは、HPC ワークロードの実行における重要な課題でした。高性能ストレージに対するこの要件はクラウドでも変わっておらず、実際には、大量のストレージを迅速かつ簡単に利用できることが最重要事項となっています。

HPC センターは、Lustre 並列ファイル システムなどのテクノロジーを使用して、オンプレミスでこのニーズを長年満たしてきました。Lustre は、現在最も人気のあるオープンソースの高性能ストレージ ソリューションの一つです。2005 年 6 月以降、世界で最も高速なスーパー コンピュータの上位 10 台のうち少なくとも半数、上位 100 台のうち 60 台以上で一貫して使用されています。Lustre は最大数百 PB の容量にスケールアップでき、単一の名前空間で TB/秒のスループットを実現するシステムにより、HPC ジョブで可能な最大パフォーマンスを実現します。

Google Cloud では、ストレージの需要に対応するために 2 つのアプローチを採用しています。まず、GCP は DDN と提携して、サポートされているエンタープライズ クラスの DDN EXAScaler Lustre ソフトウェアを GCP Marketplace に導入しました。第 2 に、Google Cloud のエンジニアが、Google Cloud Deployment Manager を使用して Google Compute Engine に Lustre ストレージ クラスタを簡単に構成してデプロイするためのスクリプト セットを開発し、オープンソース化しました

Google Cloud Platform 上の Lustre は、実行されているインフラストラクチャの最大パフォーマンスを同様に実現できます。GCP でのパフォーマンスは非常に優れており、2019 年にはパートナーの DDN とともに IO-500 ストレージ システム ベンチマークで 8 位にランクインしました。これは、IO-500 でクラウドベースのファイル システムとして最高位にランクインしたことを意味します。今回は、Lustre 用のオープンソース Deployment Manager スクリプトをデプロイする方法について説明します。Lustre クラスタの Lustre 専門家によるサポートや、管理とモニタリングの GUI や Lustre チューニングなどの機能を利用して、エンタープライズ向けの強化された Lustre 環境を構築する場合は、DDN EXAScaler Marketplace サービスを検討することをおすすめします。

学習内容

  • GCP Deployment Manager サービスの使用方法
  • GCP で Lustre ファイル システムを構成してデプロイする方法。
  • ストライピングを構成し、Lustre ファイル システムに対して単純な I/O をテストする方法。

前提条件

  • Google Cloud Platform アカウントと、課金が有効になっているプロジェクト
  • 基本的な Linux の経験

2. セットアップ

セルフペース型の環境設定

プロジェクトを作成

Google アカウント(Gmail または G Suite)をお持ちでない場合は、アカウントを作成する必要があります。Google Cloud Platform コンソール(console.cloud.google.com)にログインし、[リソースの管理] ページを開きます。

359c06e07e6d699f.png

[プロジェクトを作成] をクリックします。

25c23d651abb837b.png

プロジェクト名を入力します。プロジェクト ID(上のスクリーンショットで赤でハイライト表示されている部分)をメモしておきます。プロジェクト ID は、すべての Google Cloud プロジェクトで一意の名前である必要があります。プロジェクト名が一意でない場合、Google Cloud はプロジェクト名に基づいてランダムなプロジェクト ID を生成します。

次に、Google Cloud リソースを使用するために、Developers Console で課金を有効にする必要があります。

この Codelab の操作をすべて行っても、費用は数ドル程度です。ただし、その他のリソースを使いたい場合や、実行したままにしておきたいステップがある場合は、追加コストがかかる可能性があります(このドキュメントの最後にある「まとめ」セクションを参照)。Google Cloud Platform 料金計算ツールはこちらでご利用いただけます。

Google Cloud Platform の新規ユーザーは、$300 の無料トライアルをご利用いただけます。

Google Cloud Shell

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Google Cloud Shell を起動する

GCP Console で右上のツールバーにある Cloud Shell アイコンをクリックします。

dbad104cef962719.png

[Cloud Shell の起動] をクリックします。

4e50db320508ac88.png

プロビジョニングと環境への接続にはそれほど時間はかかりません。

20b0aa80492144d.png

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスが大幅に向上し、認証が簡素化されています。このラボでの作業のほとんどは、ウェブブラウザまたは Google Chromebook から実行できます。

Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自の PROJECT_ID が設定されていることがわかります。

$ gcloud auth list

コマンド出力:

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
$ gcloud config list project

コマンド出力:

[core]
project = <PROJECT_ID>

プロジェクト ID が正しく設定されていない場合は、次のコマンドを使用して設定できます。

$ gcloud config set project <PROJECT_ID>

コマンド出力:

Updated property [core/project].

3. Lustre デプロイ構成を準備して確認する

Lustre Deployment Manager スクリプトをダウンロードする

Cloud Shell セッションで次のコマンドを実行して、Lustre for Google Cloud Platform の Deployment Manager ファイルを含む Git リポジトリのクローンを作成(ダウンロード)します。

git clone https://github.com/GoogleCloudPlatform/deploymentmanager-samples.git

次のコマンドを実行して、Lustre デプロイ構成ディレクトリに切り替えます。

cd deploymentmanager-samples/community/lustre/

Lustre Deployment YAML を構成する

Deployment Manager は YAML ファイルを使用してデプロイ構成を提供します。この YAML ファイルには、デプロイする Lustre のバージョンやデプロイするマシン インスタンス タイプなど、デプロイの構成が詳しく記述されています。このファイルは、割り当ての増加なしで新しいプロジェクトにデプロイするようにデフォルトで構成されていますが、この Codelab では必要に応じてマシンタイプや容量を変更できます。この Codelab はこれらのデフォルトを使用するように記述されているため、変更を行う場合は、エラーを回避するために、この Codelab 全体で変更を適用する必要があります。本番環境では、MDS ノードに少なくとも 32 個の vCPU インスタンス、OSS ノードにストレージ容量とタイプに応じて少なくとも 8 個または 16 個の vCPU インスタンスをおすすめします。

Cloud Shell セッションで YAML ファイルを確認または編集するには、デプロイ構成 YAML ファイル Lustre-cluster.yaml開きます。ファイルの内容を表示するには、お好みのコマンドライン エディタ(vi、nano、emacs など)を使用するか、Cloud Console コードエディタを使用します。

11efd5af658f1842.png

ファイルの内容は次のようになります。

# [START cluster_yaml]
imports:
- path: lustre.jinja

resources:
- name: lustre
  type: lustre.jinja
  properties:
    ## Cluster Configuration
    cluster_name            : lustre
    zone                    : us-central1-f
    cidr                    : 10.20.0.0/16
    external_ips            : True
    ### Use these fields to deploy Lustre in an existing VPC, Subnet, and/or Shared VPC
    #vpc_net                 : < VPC Network Name >
    #vpc_subnet              : < VPC Subnet Name >
    #shared_vpc_host_proj    : < Shared VPC Host Project name >

    ## Filesystem Configuration
    fs_name                 : lustre
    ### Review https://downloads.whamcloud.com/public/ to determine version naming
    lustre_version          : latest-release
    e2fs_version            : latest

    ## Lustre MDS/MGS Node Configuration
    #mds_node_count          : 1
    mds_ip_address          : 10.20.0.2
    mds_machine_type        : n1-standard-8
    ### MDS/MGS Boot disk
    mds_boot_disk_type      : pd-standard
    mds_boot_disk_size_gb   : 10
    ### Lustre MetaData Target disk
    mdt_disk_type           : pd-ssd
    mdt_disk_size_gb        : 1000

    ## Lustre OSS Configuration
    oss_node_count          : 4
    oss_ip_range_start      : 10.20.0.5
    oss_machine_type        : n1-standard-4
    ### OSS Boot disk
    oss_boot_disk_type      : pd-standard
    oss_boot_disk_size_gb   : 10
    ### Lustre Object Storage Target disk
    ost_disk_type           : pd-standard
    ost_disk_size_gb        : 5000
#  [END cluster_yaml]

この YAML ファイルには複数のフィールドがあります。アスタリスク(*)が付いている以下のフィールドは必須です。次のようなフィールドがあります。

クラスタ構成

  • cluster_name* - Lustre クラスタの名前。デプロイされたすべてのリソースの前に付加されます
  • zone* - クラスタをデプロイするゾーン
  • cidr* - CIDR 形式の IP 範囲
  • external_ips* - True/False。Lustre ノードに外部 IP アドレスがあるかどうか。false の場合、Cloud NAT は NAT ゲートウェイとして設定されます。
  • vpc_net - このフィールドと vpc_subnet フィールドを定義して、既存の VPC に Lustre クラスタをデプロイします。
  • vpc_subnet - Lustre クラスタのデプロイ先となる既存の VPC サブネット
  • shared_vpc_host_proj - このフィールドと vpc_net フィールドおよび vpc_subnet フィールドを定義して、クラスタを共有 VPC にデプロイします。

ファイル システムの構成

  • fs_name - Lustre ファイル システム名
  • lustre_version - デプロイする Lustre のバージョン。https://downloads.whamcloud.com/public/lustre/ から最新のブランチをデプロイするには「latest-release」を使用し、その他のバージョンをデプロイするには lustre-X.X.X を使用します。
  • e2fs_version - デプロイする E2fsprogs のバージョン。https://downloads.whamcloud.com/public/e2fsprogs/ から最新のブランチをデプロイする場合は「latest」、他のバージョンをデプロイする場合は X.XX.X.wcX を使用します。

MDS/MGS の構成

  • mds_ip_address - MDS/MGS ノードに指定する内部 IP アドレス
  • mds_machine_type - MDS/MGS ノードに使用するマシンタイプ(https://cloud.google.com/compute/docs/machine-types を参照)
  • mds_boot_disk_type - MDS/MGS ブートディスクに使用するディスクタイプ(pd-standard、pd-ssd)
  • mds_boot_disk_size_gb - MDS ブートディスクのサイズ(GB)
  • mdt_disk_type* - メタデータ ターゲット(MDT)ディスクに使用するディスクタイプ(pd-standard、pd-ssd、local-ssd)
  • mdt_disk_size_gb* - MDT ディスクのサイズ(GB)

OSS の構成

  • oss_node_count* - 作成するオブジェクト ストレージ サーバー(OSS)ノードの数
  • oss_ip_range_start - OSS ノードの IP 範囲の開始。指定しない場合は、自動 IP 割り当てを使用する
  • oss_machine_type - OSS ノードに使用するマシンタイプ
  • oss_boot_disk_type - OSS ブートディスクに使用するディスクタイプ(pd-standard、pd-ssd)
  • oss_boot_disk_size_gb - MDS ブートディスクのサイズ(GB)
  • ost_disk_type* - オブジェクト ストレージ ターゲット(OST)ディスクに使用するディスクタイプ(pd-standard、pd-ssd、local-ssd)
  • ost_disk_size_gb* - OST ディスクのサイズ(GB)

4. 構成のデプロイと確認

構成をデプロイする

Cloud Shell セッションで、Lustre-gcp フォルダから次のコマンドを実行します。

gcloud deployment-manager deployments create lustre --config lustre.yaml

このコマンドは、Lustre という名前の Deployment を作成します。この操作は完了するまでに 10 ~ 20 分ほどかかることがあります。しばらくお待ちください

デプロイが完了すると、次のような出力が表示されます。

Create operation operation-1572410719018-5961966591cad-e25384f6-d4c905f8 completed successfully.
NAME                                TYPE                   STATE      ERRORS  INTENT
lustre-all-internal-firewall-rule  compute.v1.firewall    COMPLETED  []
lustre-lustre-network              compute.v1.network     COMPLETED  []
lustre-lustre-subnet               compute.v1.subnetwork  COMPLETED  []
lustre-mds1                        compute.v1.instance    COMPLETED  []
lustre-oss1                        compute.v1.instance    COMPLETED  []
lustre-oss2                        compute.v1.instance    COMPLETED  []
lustre-oss3                        compute.v1.instance    COMPLETED  []
lustre-oss4                        compute.v1.instance    COMPLETED  []
lustre-ssh-firewall-rule           compute.v1.firewall    COMPLETED  []

デプロイを確認する

5f2a0557d3f2476f.png

Google Cloud Platform Console でデプロイを表示する手順は次のとおりです。

  • Cloud Platform Console で、コンソールの左上にある [プロダクトとサービス] メニュー(3 本の横線)を開きます。
  • [Deployment Manager] をクリックします。
  • [Lustre] をクリックして、デプロイの詳細を表示します。
  • [概要 - Lustre] をクリックします。[デプロイ プロパティ] ペインに、デプロイの全体的な構成が表示されます。
  • [Config] プロパティの [表示] をクリックします。[構成] ペインに、先ほど変更したデプロイ構成 YAML ファイルの内容が表示されます。続行する前に、内容が正しいことを確認してください。デプロイ構成を変更する必要がある場合は、「デプロイをクリーンアップする」の手順に沿ってデプロイを削除し、「Lustre デプロイ YAML を構成する」の手順に沿ってデプロイを再起動します。
  • (省略可)[Lustre-cluster] セクションで、Lustre.jinja テンプレートによって作成された各リソースをクリックし、詳細を確認します。

デプロイの構成が検証されたら、クラスタのインスタンスが起動していることを確認します。Cloud Platform コンソールの [プロダクトとサービス] メニューで、[Compute Engine] > [VM インスタンス] をクリックします。

aec8498e04a3c334.png

[VM インスタンス] ページで、Deployment Manager によって作成された 5 つの仮想マシン インスタンスを確認します。これには、lustre-mds1lustre-oss1lustre-oss2、lustre-oss3、lustre-oss4 が含まれます。

5. Lustre クラスタにアクセスする

インストールをモニタリングする

[VM インスタンス] ページで、[lustre-mds1] をクリックして [インスタンスの詳細] ページを開きます。

ba0bea7acdbb9527.png

[シリアルポート 1(コンソール)] をクリックして、シリアル コンソール出力ページを開きます。このシリアル出力を使用して、MDS インスタンスのインストール プロセスをモニタリングし、起動スクリプトが完了するまで待ちます。ページ上部の [更新] ボタンをクリックして、シリアル出力を更新します。ノードは 1 回再起動して Lustre カーネルを起動し、次のようなメッセージを表示します。

Startup finished in 838ms (kernel) + 6.964s (initrd) + 49.302s (userspace) = 57.105s.
Lustre: lustre-MDT0000: Connection restored to 374e2d80-0b31-0cd7-b2bf-de35b8119534 (at 0@lo)

これは、Lustre が Lustre クラスタにインストールされ、ファイル システムを使用する準備ができたことを意味します。

Lustre クラスタにアクセスする

Cloud Shell セッションで、Google Cloud コンソールの lustre-mds1 インスタンスの横にある [SSH] ボタンをクリックします。または、Cloud Shell で次のコマンドを実行します。<ZONE> は lustre-mds1 ノードのゾーンに置き換えます。

gcloud compute ssh lustre-mds1 --zone=<ZONE>

このコマンドは、lustre-mds1 仮想マシンにログインします。これは Lustre メタデータ サーバー(MDS)インスタンスで、Lustre 管理サーバー(MGS)インスタンスとしても機能します。このインスタンスは、ファイル システムのすべての認証リクエストとメタデータ リクエストを処理します。

後でテストできるように、lustre-mds1 インスタンスにファイル システムをマウントしましょう。次のコマンドを実行します。

sudo mkdir /mnt/lustre
sudo mount -t lustre lustre-mds1:/lustre /mnt/lustre
cd /mnt/lustre

これらの 3 つのコマンドは、次の 3 つの処理を行います。最初のコマンドは、マウント ポイントとして使用するローカル ディレクトリ「/mnt/lustre」を作成します。2 番目のコマンドは、「mount」コマンドを実行して、「lustre」タイプのファイル システムをマウントします。このファイル システムは lustre-mds1 サーバーに存在し、ファイル システム名は「lustre」で、「/lustre」として認識されます。mount コマンドは、ローカルの「/mnt/lustre」ディレクトリに Lustre ファイル システムをマウントします。最後に、3 番目のコマンドは、Lustre がマウントされている /mnt/lustre ディレクトリにディレクトリを変更します。

これで、Lustre ファイル システムが /mnt/lustre にマウントされました。このファイル システムで何ができるかを見てみましょう。

6. Lustre CLI ツールのツアー

Lustre とそのツールに慣れていない場合は、ここでいくつかの重要なコマンドについて説明します。

Lustre のローレベルのクラスタ管理ツールは「lctl」です。lctl を使用して、Lustre クラスタを構成して管理し、Lustre クラスタのサービスを表示できます。新しい Lustre クラスタのサービスとインスタンスを表示するには、次のコマンドを実行します。

sudo lctl dl

Lustre YAML 構成ファイルに加えた変更に応じて、次のような出力が表示されます。

  0 UP osd-ldiskfs lustre-MDT0000-osd lustre-MDT0000-osd_UUID 11
  1 UP mgs MGS MGS 12
  2 UP mgc MGC10.128.15.2@tcp 374e2d80-0b31-0cd7-b2bf-de35b8119534 4
  3 UP mds MDS MDS_uuid 2
  4 UP lod lustre-MDT0000-mdtlov lustre-MDT0000-mdtlov_UUID 3
  5 UP mdt lustre-MDT0000 lustre-MDT0000_UUID 12
  6 UP mdd lustre-MDD0000 lustre-MDD0000_UUID 3
  7 UP qmt lustre-QMT0000 lustre-QMT0000_UUID 3
  8 UP lwp lustre-MDT0000-lwp-MDT0000 lustre-MDT0000-lwp-MDT0000_UUID 4
  9 UP osp lustre-OST0000-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
 10 UP osp lustre-OST0002-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
 11 UP osp lustre-OST0001-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
 12 UP osp lustre-OST0003-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4

Lustre 管理サーバー(MGS)は項目 1、Lustre メタデータ サーバー(MDS)は項目 3、Lustre メタデータ ターゲット(MDT)は項目 5、4 つの Lustre オブジェクト ストレージ サーバー(OSS)は項目 8 ~ 12 に表示されます。他のサービスについては、Lustre マニュアルをご覧ください。

Lustre のファイル システム構成ツールは「lfs」です。lfs を使用して、Lustre オブジェクト ストレージ サーバー(OSS)とそれぞれのオブジェクト ストレージ ターゲット(OST)間でファイルのストライピングを管理できます。また、find、df、割り当て管理などの一般的なファイル システム オペレーションを実行することもできます。

ストライピングを使用すると、Lustre クラスタ全体にファイルを分散する方法を構成して、可能な限り最高のパフォーマンスを実現できます。大きなファイルをできるだけ多くの OSS にストライピングすると、IO が並列化されて最適なパフォーマンスが得られることが多いですが、小さなファイルをストライピングすると、そのファイルが単一のインスタンスにのみ書き込まれた場合よりもパフォーマンスが低下する可能性があります。

これをテストするために、2 つのディレクトリを設定します。1 つはストライプ数が 1 の OSS、もう 1 つはストライプ数が「-1」で、そのディレクトリに書き込まれたファイルが可能な限り多くの OSS にストライプ化されることを示します。ディレクトリには、そのディレクトリ内で作成されたファイルに継承されるストライピング構成を保持できますが、そのディレクトリ内のサブディレクトリと個々のファイルは、必要に応じて異なるストライピング構成に設定できます。これらの 2 つのディレクトリを作成するには、「/mnt/lustre」ディレクトリで次のコマンドを実行します。

sudo mkdir stripe_one
sudo mkdir stripe_all
sudo lfs setstripe -c 1 stripe_one/
sudo lfs setstripe -c -1 stripe_all/

lfs getstripe を使用して、ファイルまたはディレクトリのストライプ設定を表示できます。

sudo lfs getstripe stripe_all/

ストライプ数が -1 に設定されていることを示す出力が表示されます。

stripe_all/
stripe_count:  -1 stripe_size:   1048576 pattern:    raid0 stripe_offset: -1

これで、複数の OSS にストライプ化された大きなファイルを作成することで実現できるパフォーマンスの改善をテストする準備が整いました。

7. Lustre I/O をテストする

Lustre IO の 2 つの簡単なテストを実行して、Lustre ファイル システムのパフォーマンス上の利点とスケーリング機能を示します。まず、「dd」ユーティリティを使用して簡単なテストを実行し、5 GB のファイルを「stripe_one」ディレクトリに書き込みます。次のコマンドを実行します。

sudo dd if=/dev/zero of=stripe_one/test bs=1M count=5000

5 GB のデータをファイル システムに書き込むプロセスは、平均で約 27 秒かかります。これは、単一のオブジェクト ストレージ サーバー(OSS)上の単一の Persistent Disk(PD)に書き込む場合です。

複数の OSS(つまり複数の PD)にわたるストライピングをテストするには、書き込み先の出力ディレクトリを変更するだけです。次のコマンドを実行します。

sudo dd if=/dev/zero of=stripe_all/test bs=1M count=5000

「of=stripe_one/test」が「of=stripe_all/test」に変更されていることに注意してください。これにより、単一ストリームの書き込みをすべてのオブジェクト ストレージ サーバーに分散し、4 つの OSS を使用して平均 5.5 秒で書き込みを完了できます。これは、約 4 倍の速さです。

このパフォーマンスは、オブジェクト ストレージ サーバーを追加するにつれて向上し続けます。ファイル システムをオンラインで OSS を追加し、データをストライピングして容量とパフォーマンスをオンラインで向上させることができます。Google Cloud Platform で Lustre を使用すれば、無限の可能性が広がります。皆様がどのようなものを構築し、どのような問題を解決できるか、楽しみです。

8. まとめ

お疲れさまでした。これで、Google Cloud Platform に Lustre クラスタが作成されました。これらのスクリプトを開始点として使用して、独自の Lustre クラスタを構築し、クラウドベースのコンピューティング クラスタと統合できます。

Deployment をクリーンアップする

Lustre ノードからログアウトします。

exit

Lustre クラスタからログアウトした後、Google Cloud Shell から次のコマンドを実行すると、デプロイを簡単にクリーンアップできます。

gcloud deployment-manager deployments delete lustre

プロンプトが表示されたら、「Y」と入力して続行します。このオペレーションには時間がかかることがあります。しばらくお待ちください。

プロジェクトを削除する

クリーンアップするには、プロジェクトを削除します。

  • ナビゲーション メニューで [IAM と管理] を選択します。
  • サブメニューの [設定] をクリックします。
  • [プロジェクトを削除] というテキストが表示されたゴミ箱アイコンをクリックします。
  • プロンプトの指示に沿って操作する

学習した内容

  • GCP Deployment Manager サービスの使用方法。
  • GCP で Lustre ファイル システムを構成してデプロイする方法。
  • ストライピングを構成し、Lustre ファイル システムに対して単純な I/O をテストする方法。

サポートを利用する

Lustre デプロイ マネージャー スクリプトを使用してクールなものを作成していますか?ご不明な点がございましたら、Google Cloud Lustre ディスカッション グループでチャットしてください。機能のリクエスト、フィードバックの提供、バグの報告を行うには、こちらのフォームをご利用ください。また、コードを修正して pull リクエストを送信することもできます。Google Cloud のエキスパートに相談したいですか?Google Cloud のハイ パフォーマンス コンピューティングのウェブサイトから、Google Cloud チームにお問い合わせください。

詳細

フィードバック

この Codelab に関するフィードバックは、こちらのリンクからお送りください。フィードバックの所要時間は 5 分未満です。ありがとうございました。