第7章 ファイルシステム

本章では、Red Hat Enterprise Linux でサポートされているファイルシステムの概要とそれらのパフォーマンスを最適化する方法を説明します。

7.1. ファイルシステムのチューニングで考慮すべき点

チューニングの際に考慮すべき点で全ファイルシステムに共通することがいくつかあります。使用中のシステムに選択するフォーマットとマウントのオプション、特定のシステムでパフォーマンスを向上させる可能性のあるアプリケーションに使用可能なアクション、などです。

7.1.1. フォーマットのオプション

ファイルシステムのブロックサイズ

ブロックサイズは、mkfs 実行時に選択することができます。有効なサイズの範囲はシステムによって異なります。上限はホストシステムの最大ページサイズで、下限は使用しているファイルシステムに依存します。デフォルトのブロックサイズは、ほとんどのユースケースに適しています。

デフォルトのブロックサイズよりも小さいファイルの作成を多く予定している場合は、ブロックサイズを小さく設定してディスク領域の無駄を最小限にできます。しかし、ブロックサイズを小さく設定すると、ファイルシステムの最大サイズを制限し、ファイルが選択されたブロックサイズよりも大きい場合は特に、新たなランタイムオーバーヘッドが発生する可能性があります。
ファイルシステムジオメトリ

システムで RAID5 などのストライプストレージを使用している場合、mkfs 実行時に基礎的ストレージジオメトリを使ってデータやメタデータを整えて、パフォーマンスを改善することができます。ソフトウェア RAID (LVM または MD) とエンタープライズハードウェアストレージのいくつかでは、この情報はクエリされ自動的に設定されますが、多くの場合、管理者がコマンドラインで mkfs を使って手動でこのジオメトリを指定する必要があります。

これらのファイルシステムの作成および保守についての詳細情報は 『ストレージ管理ガイド』 を参照してください。
外部ジャーナル

メタデータ集約型のワークロードは、(ext4 や XFS などの) ジャーナリングファイルシステムのログセクションが非常に頻繁に更新されることを意味します。ファイルシステムからジャーナルへのシーク回数を最小限にするには、ジャーナルを専用のストレージに配置します。しかし、主たるファイルシステムよりも遅い外部ストレージにジャーナルを配置すると、外部ストレージを使用することで得られる利点が帳消しになる場合もあることに注意してください。

警告

外部ジャーナルが信頼できるものであることを確認してください。外部のジャーナルデバイスが失われると、ファイルシステムが破損します。
外部ジャーナルは、マウント時に指定されたジャーナルデバイスで mkfs 実行時に作成されます。詳細は mke2fs(8)mkfs.xfs(8)mount(8) の man ページを参照してください。

7.1.2. マウントオプション

バリア

書き込みバリアは、揮発性の書き込みキャッシュが電源を喪失しても、ファイルシステムのメタデータが正しく書かれ、一貫性のあるストレージに整理されていることを確認するためのカーネルメカニズムです。書き込みバリアが有効なファイルシステムは、fsync() 経由で発信されたデータが停電中も確実に持続されるようにします。Red Hat Enterprise Linux はデフォルトでサポート対象の全ハードウェアに対してバリアを有効にします。

しかし、書き込みバリアを有効にすると非常に遅くなるアプリケーションもあります。fsync() を大量に使うアプリケーションや小さいファイルを多く作成したり削除したりするアプリケーションは特にそうです。揮発性の書き込みキャッシュがないストレージや、電源喪失後のファイルシステムの不整合やデータ損失が許される場合などの稀なケースでは、nobarrier マウントオプションを使用してバリアを無効にできます。詳細は 『ストレージ管理ガイド』 を参照してください。
アクセスタイム (noatime)

従来はファイルが読み取られると、そのファイルのアクセスタイム (atime) は inode メタデータで更新される必要があり、このために新たな 書き込み I/O が行われました。正確な atime メタデータが不要な場合は、noatime オプションでファイルシステムをマウントしてこのメタデータ更新を削除します。しかしほとんどの場合、Red Hat Enterprise Linux 6 カーネルにおけるデフォルトの相対的 atime (または relatime) 動作のために、atime のオーバーヘッドは大きなものではありません。relatime 動作は、以前の atime が修正時間 (mtime) やステータス変更時間 (ctime) よりも古い場合にのみ、atime を更新します。

注記

noatime オプションを有効にすると、nodiratime 動作も有効になります。noatimenodiratime の両方を設定する必要はありません。
先読みサポートの強化

先読みは、データを先に取得してページキャッシュにロードすることでディスクからではなくメモリで先に使用可能となり、ファイルアクセスを速くします。大量の連続 I/O のストリーミングを行うワークロードなどでは、先読みの値が高いと効果が高まります。

tuned ツールと LVM ストライピングの使用は先読みの値を高めますが、ワークロードによってはこれでは不十分なものもあります。また、Red Hat Enterprise Linux は、検出可能なファイルシステムに基づく先読みの値の適切な設定が常にできるわけではありません。例えば、強力なストレージアレイが単一の強力な LUN として Red Hat Enterprise Linux に提示されたとすると、オペレーティングシステムはこれを強力な LUN アレイとして扱わず、デフォルトではストレージで利用可能な先読みの利点を完全には活かせないことになります。
先読みの値を表示、編集するには、blockdev コマンドを使います。特定のブロックデバイスに対する現在の先読みの値を表示するには、以下のコマンドを実行します。
# blockdev -getra device
そのブロックデバイスの先読みの値を修正するには、以下のコマンドを実行します。N は、512 バイトセクターの番号を表します。
# blockdev -setra N device
blockdev コマンドで選択された値は、リブート後には維持されないことに注意してください。ブート中にこの値を設定するには、ランレベル init.d スクリプトを作成することが推奨されます。

7.1.3. ファイルシステムのメンテナンス

未使用ブロックの破棄

バッチ破棄やオンライン破棄のオペレーションは、マウント済みファイルシステムの機能で、ファイルシステムが使用していないブロックを破棄します。ソリッドステートドライブとシンプロビジョニングのストレージの両方で役に立ちます。

バッチ破棄オペレーション は、 fstrim コマンドで明示的に実行されます。このコマンドは、ユーザーの条件と一致するファイルシステム内の未使用ブロックをすべて破棄します。両方のオペレーションタイプは、ファイルシステムの基盤となっているブロックデバイスが物理的な破棄オペレーションに対応している限り、Red Hat Enterprise Linux 6.2 以降の XFS および ext4 ファイルシステムでの使用が可能です。物理的な破棄オペレーションは、/sys/block/device/queue/discard_max_bytes の値がゼロでない場合にサポートされます。
オンライン破棄オペレーションは、マウント時に -o discard オプション (/etc/fstab 内、または mount コマンドで指定) で指定して、ユーザーの介入なしでリアルタイムで実行されます。オンライン破棄オペレーションは、使用済から空きに移行するブロックのみを破棄します。オンライン破棄オペレーションは、Red Hat Enterprise Linux 6.2 以降の ext4 ファイルシステムか、Red Hat Enterprise Linux 6.4 以降の XFS ファイルシステムで対応しています。
Red Hat は、システムのワークロードがバッチ破棄で対応できない場合、パフォーマンスの維持にオンライン破棄オペレーションが必要な場合以外は、バッチ破棄オペレーションを推奨しています。

7.1.4. アプリケーションの留意事項

事前割り当て

ext4、XFS、GFS2 の各ファイルシステムは、fallocate(2) glibc コール経由で効率的なスペースの事前割り当てをサポートします。書き込みパターンが理由でファイルが非常に断片化され、読み取りパフォーマンスが悪化する場合、スペースの事前割り当ては便利なテクニックになります。事前割り当てでは、データをスペースに書き込まずにそのディスクスペースがまるでファイルに割り当てられたかのようにマークします。事前割り当てのブロックに実際のデータが書き込まれるまで、読み取りオペレーションはゼロを返します。