目次


共通テーマ: アドバンスト・ファイルシステム・インプリメンター・ガイド 第9回

XFSの導入

Comments

今回はXFSについて考察します。XFSとは、Linuxに対応する64ビットのハイ・パフォーマンス・ファイルシステムであり、SGIがフリーで提供しています。まずは、XFSとext3およびReiserFSをどのような点で比較するか説明し、XFSの内部で使用される多くのテクノロジーについて解説します。そして次回は、XFSをみなさんのシステムにセットアップする方法について説明し、XFSチューニングのヒントと、ACL (アクセス制御リスト) や拡張属性サポートなどの便利なXFS機能を紹介します。

XFSの導入

XFSは、90年代初頭にSilicon Graphics, Inc. (SGI) によって開発されました。当時SGIは、自社の既存のファイルシステム (EFS) が当時のコンピューティングにおける課題への対応力を急速に失ってきていることに気付きました。SGIはこの問題に取り組む上で、EFSに対して当初の設計内容から外れるような修正を施すのではなく、まったく新しい64ビットのハイ・パフォーマンス・ファイルシステムを設計することにしました。こうしてXFSが誕生し、1994年のIRIX 5.3のリリースによって、コンピューティングに携わる人々が利用できるようになったわけです。それ以来XFSは、ワークステーションからスーパーコンピューターまで、SGIのあらゆるIRIXベース製品に対する基本ファイルシステムとして使用されています。そして現在ではLinuxにも対応しています。Linux対応のXFSの誕生は画期的なことです。それは何と言っても、堅固で洗練された機能性豊かなファイルシステムをLinuxユーザーに提供し、ストレージに関する極めて困難な問題への対応を可能とするからです。

XFS、ReiserFS、ext3のパフォーマンス

今日まで、適切な次世代Linuxファイルシステムの選択は極めて簡単でした。純粋にパフォーマンスを追求する場合は一般にReiserFSが好まれ、綿密なデータ保全性を求める場合はext3が好まれていました。しかしLinux対応のXFSのリリースによって、事態は一気に複雑になりました。とりわけ、ReiserFSが依然として次世代のパフォーマンス・リーダーであるとは言い切れなくなっています。

最近私は、その製品の本来のパフォーマンスに関してXFS、ReiserFS、ext3を比較するために、一連のテストを行いました。結果を発表する前に、強調しておきたいことがあります。このテスト結果は、ユニプロセッサー・システムにおける軽いシステム負荷の下で一般的なファイルシステム・パフォーマンスがどんな傾向を示すか、ということに焦点を当てているにすぎません。特定のファイルシステムが他のファイルシステムより「優れている」かどうかを示す絶対的な手段ではありません。しかし、特定のタスクに対して最適と言える可能性が最も高いのはどんなファイルシステムかを把握する上で、このテスト結果は役に立つはずです。繰り返しますが、このテスト結果は絶対的なものではありません。特定のアプリケーションの動作をファイルシステムごとに調べる方法が、最も良い方法でしょう。

結果

私のテストでは、XFSが全般的に極めて速いことが判明しました。大きなファイルの操作に関するテストでは、XFSは一貫して他に勝っていました。もともとXFSは、長年にわたり、こうした操作を行うよう設計され調整されてきたものであり、この結果は予想通りのものでした。また、XFSには奇妙なパフォーマンス特性があることもわかりました。それはファイルの削除に時間がかかるということです。この点に関しては、ReiserFSとext3の方がはるかに優れていました。SGIのファイルシステム・ソフトウェア担当主任エンジニアであるSteve Lord氏によると、この問題に対応するためのパッチがちょうど完成したところであり、まもなく利用できるようになるそうです。

これ以外の点では、XFSのパフォーマンスはReiserFSに匹敵するものであり、概ねext3を上回っています。XFSの最も優れた点の1つは、ReiserFSと同様、不要なディスク・アクティビティーを多く発生させないことです。XFSはデータをできるだけ多くメモリーにキャッシュしようとします。そして通常は、メモリー容量が限界に達した場合にのみ、ディスクへの書き出しを行います。データをディスクにフラッシュしている間は、他の入出力操作にはほとんど影響がないようです。これとは対照的に、ext3が (デフォルトの「data=ordered」モードで) データをドライブにフラッシュする場合は、結果的に多量のシークが追加され、入出力の負荷によっては、不要なディスク・スラッシングが発生する可能性もあります。

私が行ったパフォーマンスとチューニングのテストでは、圧縮されていないカーネル・ソース・タールボールをRAMディスクからテスト用のファイルシステムに抽出し、新しいソース・ツリーを同じファイルシステムの新しいディレクトリーに再帰的にコピーすることに主眼を置きました。これらのタスクを実行する上で、XFSは非常に優れていました。もっとも、最初はパフォーマンスがReiserFSよりもわずかに劣っていました。しかしテスト用XFSファイルシステムのためにmkfs.xfsmount のオプションを調整すると、カーネル・ソース・ツリーにあるような中規模のファイルを処理する際にXFSのパフォーマンスがReiserFSをわずかに上回るように改善することができました。ただし、ファイルの削除は除きます。少なくとも今のところは、ReiserFSとext3の方がファイルの削除についてはXFSよりもはるかに迅速です。

パフォーマンスの概要

ここまでの説明で、XFSにどの程度のパフォーマンスを期待できるかだいたいご理解いただけたでしょう。この結果からわかることは、XFSは大きなファイルの操作に最も適したファイルシステムだということです。小さなファイルや中規模のファイルについても、パフォーマンスを強化するオプションをいくつか加えてXFSファイルシステムを作成しマウントすれば、XFSはReiserFSに匹敵するスピードを得ることができ、場合によってはReiserFSよりもはるかに高速になることも可能です。「data=journal」モードでのext3のパフォーマンスも優れていましたが、以前のテストから、ディスクにデータをフラッシュする際に明らかな不規則性があり、またそれに起因してディスク・スラッシングが発生する場合があるため、なかなか安定したパフォーマンス値を得ることができませんでした。

XFSの設計

USENIX '96で取り上げられた論文「Scalability in the XFS Filesystem」(この記事の末尾にある参考文献を参照) の中で、XFSは1つの中心となる考え方に基づいて設計された、とSGIのエンジニアたちは説明しています。それは「Think big(大きな発想)」という考え方です。実際にXFSは、従来のファイルシステムの限界を超えるように設計されてきました。それを可能にしているのは、XFSの背後にある設計面での特徴です。それでは、そうした興味深い特徴についていくつか見てみましょう。

アロケーション・グループの導入

XFSファイルシステムを作成する場合、基本のブロック・デバイスは、8つ以上の同じサイズのリニア領域に分割されます。これらは「チャンク」または「リニア範囲」と考えることができますが、XFS用語では各領域を「アロケーション・グループ」と呼びます。アロケーション・グループは、各アロケーション・グループがそれぞれのiノードとフリー・スペースを管理し、事実上それらをXFSファイルシステム・プロパー内で透過的に存在する一種のサブファイルシステムにするという点でユニークなものです。

アロケーション・グループとスケーラビリティー

それでは、いったいなぜXFSにはアロケーション・グループがあるのでしょうか。まず第一に、XFSは並列入出力を効率よく処理するためにアロケーション・グループを使用します。各アロケーション・グループは事実上個々の独立したエンティティーであるため、カーネルは複数のアロケーション・グループと同時にやりとりすることができます。アロケーション・グループがなければ、XFSファイルシステム・コードは、iノードの修正やメタデータの多いその他の操作のために、入出力の多いプロセスを「順に並べて」行うことにより、パフォーマンスのボトルネックを生じる可能性があります。複数のスレッドおよびプロセスの多くが同じファイルシステムで大量の入出力を実行していても、アロケーション・グループがあれば、XFSコードはこれらのスレッドおよびプロセスを引き続き並列に実行することができます。したがってXFSとハイエンドなハードウェアを組み合わせれば、ファイルシステムのボトルネックではなく、ハイエンドな結果を得ることができるでしょう。また複数のメタデータの更新を同時に「転送」できるため、アロケーション・グループはマルチプロセッサー・システムの並列入出力パフォーマンスの最適化にも役立ちます。

さまざまな箇所でのB+ ツリーの使用

内部的に、アロケーション・グループは効率的なB+ ツリーを使用して、フリー・スペースの範囲(「エクステント」ともいう)などの重要なデータとiノードを追跡します。実際、各アロケーション・グループは、フリー・スペースの追跡に使用するB+ ツリーを2つ持っています。1つのツリーには、フリー・スペースのエクステントがサイズ順に格納され、もう1つのツリーには、領域がブロック・デバイス上の開始物理位置の順に格納されます。フリー・スペースの領域をすばやく見つけられることは、書き込みパフォーマンスを最大にする上で重要であり、これはXFSの特長です。

XFSはiノードの管理に関しても非常に効率的です。各アロケーション・グループは、必要に応じてiノードを64のグループに割り振り、各iノード番号がディスクのどこにあるのかを記録するB+ ツリーを使用して、個々のiノードを追跡します。このようなB+ ツリーの優れたパフォーマンスとスケーラビリティーが、XFSがB+ ツリーをさまざまな箇所で使用する理由なのです。

ジャーナリング

もちろんXFSはジャーナリング・ファイルシステムであり、予期せぬリブートの後には迅速なリカバリーを行います。ReiserFSと同様、XFSは論理ジャーナルを使用します。つまり、ext3のようにリテラル・ファイルシステム・ブロックをジャーナルするのではなく、効率的なオン・ディスク・フォーマットを使用してメタデータの変更を記録します。XFSの場合、論理ジャーナリングが適しています。ハイエンドなハードウェアでは、ジャーナルは往々にしてファイルシステム全体で最も競合するリソースです。スペース効率の高い論理ジャーナルを使用することによって、ジャーナルの競合を最小限に抑えることができます。さらにXFSは、他のディスクのパーティションなど、別のブロック・デバイスにジャーナルを格納することができます。この機能によって、XFSファイルシステムのパフォーマンスはさらに向上します。

ReiserFSと同様、XFSはメタデータをジャーナルするだけであり、メタデータが書き込まれる前にデータをディスクに確実に移動させるような特別な策は講じません。そのため、XFSでは (ReiserFSと同様)、最新の修正データが予期せぬリブートによって失われる可能性があります。しかしXFSのジャーナルにおけるいくつかの特性によって、この問題が発生する可能性はReiserFSに比べて低くなります。

ReiserFSでは、予期せぬリブートによって、すでに削除したはずのファイルの一部が最新の修正ファイルに含まれる可能性があります。明らかなデータの損失に加えて、これも理論上はセキュリティーに対する脅威となります。これに対してXFSでは、リブート時、つまりXFSジャーナルが再生される際に、書き込まれていないデータ・ブロックはすべて確実にゼロになります。したがって欠落したブロックはヌル・バイトで満たされ、セキュリティー・ホールがなくなります。これは、極めて優れたアプローチです。

それでは、データ損失の問題自体についてはどうでしょうか。この問題は概ねXFSでは最小限に抑えることができます。それは、通常XFSが、特にハイ・ディスク・アクティビティーの期間に、ReiserFSよりもはるかに頻繁に保留中のメタデータの更新をディスクに書き込むためです。したがってロックアップの場合、最新のメタデータの修正を失う確率は、通常、ReiserFSよりも低くなります。もちろんこれは、タイムリーにデータ・ブロックが書き込まれないという問題に直接対処するものではありませんが、メタデータを書き込む頻度が高まれば、データを書き込む頻度も高まります。

遅延アロケーション

最後に、XFS固有の機能である遅延アロケーションについて考察し、XFSの技術概要を終えることにします。すでにご存じのことと思いますが、アロケーションという用語は、新しいデータの格納に使用するフリー・スペースの領域を見つけるプロセスを意味します。

XFSは、アロケーションを2つのステップに分けて処理します。まずXFSは、書き込み対象の新しいデータを受け取ると、保留中のトランザクションをRAMに記録し、適切な大きさのスペースを基本ファイルシステム上に確保します。しかしXFSは新しいデータ用のスペースを確保する際、どのファイルシステム・ブロックをデータの格納に使用するかを、少なくともこの段階では決定しません。XFSはこの決定をぎりぎりまで引き延ばし、このデータが実際にディスクに書き込まれる直前まで遅らせます。

アロケーションを遅らせることによってXFSは、書き込みパフォーマンスの最適化をよりしやすくします。そしてデータをディスクに書き込む際には、XFSはファイルシステム・パフォーマンスを最適化する形でフリー・スペースを適切に割り振ることができます。特に大量の新しいデータを単一のファイルに追加する場合、XFSはそのデータを格納するためにディスク上の連続した1つの領域を割り振ることができます。アロケーションの決定を遅らせなければ、不連続な複数のチャンクに対してそのままデータが書き込まれ、書き込みパフォーマンスの大幅な低下を招く可能性があります。しかしアロケーションの決定を遅らせることにより、1回の動作でデータを書き込むことができ、書き込みパフォーマンスが向上し、全体的なファイルシステムのフラグメンテーションを減らすことができます。

遅延アロケーションには、パフォーマンス上の別の利点もあります。短期的な一時ファイルが数多く作成された場合、XFSではこれらのファイルをディスクに書き込む必要がありません。ブロックが割り当てられないため、ブロックの割り当てを解除する必要がなく、基本ファイルシステムのメタデータはいっさい使われません。

まとめ

Linuxの強力な次世代ファイルシステムの1つであるXFSのパフォーマンスと技術特性についてご理解いただけたでしょうか。次回は、XFSをシステムにセットアップし実行する方法について説明します。またACLや拡張属性など、XFSの拡張機能についてもいくつか取り上げます。それでは、また !


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=228239
ArticleTitle=共通テーマ: アドバンスト・ファイルシステム・インプリメンター・ガイド 第9回
publish-date=01012002