並列分散ファイルシステムLustreを試してみた

  • 速度が出なかったのは,100Mのハブに何故か繋がってたからでした.ということで速度書き直しました.

1台では容量が足りないという場合や,速度が足りないという場合用の並列ファイルシステム.最近クラスタスパコンで使われるようになったlustreをインストールしてみました.既に2.0が出ていますが,ここでは多少ノウハウが溜まっている少し古い1.8の方をインストールしました.

  • 準備
    • マシンを3台以上用意します.
      • 1台はMGS(/MDT)と呼ばれるメタデータを入れる所.ファイルシステム全体の1-2%位を用意.ディスクの追加はできるが,MGSの追加は出来ない(or 厄介?)ようなので,少し多めに2%を取りましょう.
      • 1台はOSSと呼ばれる実際にデータ入れる所.MGSと兼ねることができます.
      • 1台はクライアント(MGSやOSSと兼ねる事は推奨しません)
      • 今回はノード間はGigabit etherで繋がっています.
  • インストール
    1. CentOS 5.5 (x86_64)を,サーバ設定でインストール
    2. NISを設定します.「CentOS サーバ設定のメモ」さんのページに良くまとまっているので,この通りに行っています.http://tmcosmos.org/linux/centos/co5_server.html
    3. Lustreのページ http://wiki.lustre.org/index.php/Main_Page から,Downloadに進んで,RedHat Enterprise の x86_64用に進み,以下のものを持ってきます.
      1. kernel-2.6.18-194.3.1.el5_lustre.1.8.4.x86_64.rpm
      2. lustre-modules-1.8.4-2.6.18_194.3.1.el5_lustre.1.8.4.x86_64.rpm
      3. lustre-ldiskfs-3.1.3-2.6.18_194.3.1.el5_lustre.1.8.4.x86_64.rpm
      4. lustre-1.8.4-2.6.18_194.3.1.el5_lustre.1.8.4.x86_64.rpm
      5. e2fsprogs-1.41.10.sun2-0redhat.rhel5.x86_64.rpm
    4. 全てのホストで,持ってきたrpmをインストールします(下のコマンド一覧参照).
    5. 全てのホストの/etc/modprobe.confに"options lnet networks=tcp0(eth0)"を追加します
    6. modprobe lnet をします(再起動してもOK)
    7. MGSサーバを作ります.mkfs.lustreコマンドがあるので,それを利用します(下のコマンド一覧参照).fsname は後の設定で使うので,分かりやすいものを.
    8. OSSサーバを作ります.mkfs.lustreで作成します.fsnameは参照するMGSサーバのものを作成.
    9. 必要なら,/etc/fstab を書き換えて自動マウントするようにします.OSSが起動するとき,MGSが無いとfailメッセージを出して終了してしまうので注意.
    10. クライアントからマウント.普通のファイルシステムと同じ感じで.(下記のコマンド参照)

まとめてコマンド

all% rpm -ivh kernel-2.6.18-194.3.1.el5_lustre.1.8.4.x86_64.rpm lustre-modules-1.8.4-2.6.18_194.3.1.el5_lustre.1.8.4.x86_64.rpm lustre-ldiskfs-3.1.3-2.6.18_194.3.1.el5_lustre.1.8.4.x86_64.rpm
all% rpm -ivh lustre-1.8.4-2.6.18_194.3.1.el5_lustre.1.8.4.x86_64.rpm
all% rpm -Uvh e2fsprogs-1.41.10.sun2-0redhat.rhel5.x86_64.rpm
mgs% /usr/sbin/mkfs.lustre --fsname=lustre --mgs --mdt /dev/sdb1
oss% /usr/sbin/mkfs.lustre --ost --fsname=lustre --mgsnode="oss1" /dev/sda1
client% mount -t lustre oss1@tcp0:/lustre /mnt/

確認.動作を試してみます.今回は,サーバを2台,クライアント1台構成で,MGSに160G, OSS3.2TB(以上2つが同じサーバ"oss1"上),OSS 2TB("oss2"上),あとクライアントという3台があります.いずれもOSSは/exportにマウントしました.

  • dfしてみる(該当箇所のみ表示)

oss1% df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 163G 460M 154G 1% /mnt/mgs
/dev/sdb2 3.2T 471M 3.0T 1% /export
oss2% df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 2.0T 471M 1.9T 1% /export
client% df -h
Filesystem Size Used Avail Use% Mounted on
192.168.xxx.xxx@tcp0:/lustre
5.1T 941M 4.9T 1% /mnt

確かに,ほぼOSSノード2個がくっついた容量を示している.

  • lustre提供のコマンドでdfしてみる.それぞれのMGSとOSSの容量が分かります.

client% lfs df -h
UUID bytes Used Available Use% Mounted on
UUID bytes Used Available Use% Mounted on
lustre-MDT0000_UUID 163.0G 459.9M 153.2G 0% /mnt[MDT:0]
lustre-OST0000_UUID 3.1T 470.8M 3.0T 0% /mnt[OST:0]
lustre-OST0001_UUID 2.0T 470.2M 1.9T 0% /mnt[OST:1]

filesystem summary: 5.1T 941.0M 4.8T 0% /mnt

  • ddで書き込んでみる.

client% dd if=/dev/zero of=/mnt/zero.dat bs=500M count=2
2+0 records in
2+0 records out
1048576000 bytes (1.0 GB) copied, 8.75246 seconds, 120 MB/s

NFSだと50MB/s弱なので,2倍以上出る!バックボーンは1Gbpsのetherなので、大体性能限界かな。

お遊びはこれからだ!

  • まだストライピングしたり,並列書き込みしたり,台数増やしたり,ベンチマーク取ってない!とりあえず,設定しただけ.

注意点

  • クライアントからマウントした状態で,OSSを切り離すとクライアントからファイルが見えなくなるだけでなく,コマンドが固まります.なので,切り離す時は注意.(OSSとクライアントを同一のPCで行うときも注意)