Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

8.4. 設定ツール

Red Hat Enterprise Linux ではストレージやファイルシステムの設定を行う際に役立つツールがいくつか用意されています。このセクションではこうしたツールを簡単に説明し、Red Hat Enterprise Linux 7 でそのツールを使用して I/O およびファイルシステム関連の問題を解決する例を紹介します。

8.4.1. ストレージパフォーマンス向けチューニングプロファイルの設定

Tuned サービスは、特定のユースケースのパフォーマンスを向上させるために設計されたプロファイルを複数提供します。次のプロファイルはストレージのパフォーマンス改善に特に役立ちます。
  • latency-performance
  • throughput-performance (デフォルト)
システムでプロファイルを設定するには次のコマンドを実行します。name には使用するプロファイル名を入力します。
$ tuned-adm profile name
tuned-adm recommend コマンドは、システムに適切なプロファイルを推奨します。
プロファイルの詳細および設定オプションなどについては、「tuned-adm」 を参照してください。

8.4.2. デフォルト I/O スケジューラーの設定

デフォルトの I/O スケジューラーとは、デバイスで他のスケジューラーを明示的に指定しなかった場合に使用されるスケジューラーです。
デフォルトのスケジューラーが指定されていない場合、cfq スケジューラーは SATA ドライブに使用され、deadline スケジューラーは他のすべてのドライブに使用されます。このセクションで説明する手順に従ってデフォルトのスケジューラーを指定した場合には、そのデフォルトスケジューラーがすべてのデバイスに適用されます。
デフォルトの I/O スケジューラーを設定するには、Tuned ツールを使用するか、/etc/default/grub ファイルを手動で変更します。
Red Hat は、Tuned ツールを使用して、起動したシステムでデフォルトの I/O スケジューラーを指定することを推奨します。elevator パラメーターを設定するには、disk プラグインを有効にします。disk プラグインの詳細は、『Tuned』 の章の 「プラグイン」 を参照してください。
GRUB 2 を使用してデフォルトのスケジューラーを変更するには、起動時またはシステムの起動時に、カーネルコマンドラインに elevator パラメーターを追加します。手順8.1「GRUB 2 を使用したデフォルト I/O スケジューラーの設定」 で説明されているように、Tuned ツールを使用するか、手動で /etc/default/grub ファイルを変更できます。

手順8.1 GRUB 2 を使用したデフォルト I/O スケジューラーの設定

起動しているシステムのデフォルト I/O スケジューラーを設定し、再起動後も設定を維持するには、以下の手順を実施します。
  1. /etc/default/grub ファイルの GRUB_CMDLINE_LINUX 行に elevator パラメーターを追加します。
    # cat /etc/default/grub
    ...
    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=vg00/lvroot rd.lvm.lv=vg00/lvswap elevator=noop"
    ...
    
    Red Hat Enterprise Linux 7 では、利用可能なスケジューラーは 期限noop、および cfq です。詳細は、kernel-doc パッケージのインストール後に利用可能な、カーネルのドキュメントにある cfq-iosched.txt ファイルおよび deadline-iosched.txt ファイルを参照してください。
  2. elevator パラメーターを追加して、新しい設定を作成します。
    BIOS ファームウェアを使用しているシステムと UEFI ファームウェアを使用しているシステムとでは、GRUB 2 設定ファイルの場所が異なります。以下のコマンドのいずれかを使用して、GRUB 2 設定ファイルを再作成します。
    • BIOS ファームウェアを使用している場合は、以下のコマンドを使用します。
      # grub2-mkconfig -o /etc/grub2.cfg
    • UEFI ファームウェアを使用している場合は、以下のコマンドを使用します。
      # grub2-mkconfig -o /etc/grub2-efi.cfg
  3. システムを再起動して、変更を有効にします。
    GNU GRand Unified Bootloader バージョン 2 (GRUB 2) の詳細な情報については、『Red Hat Enterprise Linux 7 システム管理者のガイド』のGRUB 2 についてセクションを参照してください。

8.4.3. 汎用のブロックデバイスチューニングパラメーター

このセクションにリストされている一般的なチューニングパラメーターは、/sys/block/sdX/queue/ ディレクトリーにあります。リストされたチューニングパラメーターは I/O スケジューラーのチューニングと区別され、すべての I/O スケジューラーに適用できます。
add_random
一部の I/O イベントは、/dev/random のエントロピープールに貢献します。これらの貢献のオーバーヘッドが測定可能な場合は、このパラメーターを 0 に設定できます。
iostats
デフォルト値は 1 (有効)です。iostats0 に設定すると、デバイスの I/O 統計の収集が無効になります。これにより、I/O パスのオーバーヘッドがわずかに削除されます。iostat0 に設定すると、特定の NVMe ソリッドステートストレージデバイスなど、非常に高性能なデバイスのパフォーマンスが若干向上する可能性があります。特定のストレージモデルにベンダーによって特に指定されていない限り、iostat を有効にしたままにしておくことが推奨されます。
iostats を無効にすると、デバイスの I/O 統計は /proc/diskstats ファイルに表示されなくなります。/sys/diskstats の内容は、sariostats などの I/O ツールを監視するための I/O 情報のソースです。したがって、デバイスの iostats パラメーターを無効にすると、デバイスは I/O 監視ツールの出力に表示されなくなります。
max_sectors_kb
I/O 要求の最大サイズを KB 単位で指定します。デフォルト値は 512 KB です。このパラメーターの最小値は、ストレージデバイスの論理ブロックサイズで決まります。このパラメーターの最大値は、max_hw_sectors_kb の値によって決定されます。
一部のソリッドステートディスクは、I/O リクエストが内部消去ブロックサイズよりも大きいとパフォーマンスが悪化します。システムにアタッチするソリッドステートディスクモデルがこれに該当するかを判断するには、ハードウェアのベンダーに確認し、ベンダーの推奨事項に従います。Red Hat では、max_sectors_kb を常に最適な I/O サイズと内部消去ブロックサイズの倍数にすることを推奨します。ストレージデバイスによって指定されていない場合は、いずれかのパラメーターに logical_block_size の値を使用します。
nomerges
要求をマージは、ほとんどのワークロードで有用です。ただし、デバッグの目的では、マージを無効にすると便利です。デフォルトでは、nomerges パラメーターは 0 に設定されており、マージが有効になります。単純な 1 回のマージを無効にするには、nomerges1 に設定します。すべてのタイプのマージを無効にするには、nomerges2 に設定します。
nr_requests
一度にキュー待ちさせることができる読み取りと書き込み要求の最大数を指定します。デフォルト値は 128 です。つまり、読み取りまたは書き込みを要求する次のプロセスがスリープ状態になる前に、128 個の読み取り要求と 128 書き込み要求をキューに入れることができます。
遅延の影響を受けやすいアプリケーションの場合、ライトバック I/O が書き込み要求でデバイスキューを満杯にできないようにするため、このパラメーターの値を低くしてストレージのコマンドキューの深さを制限します。デバイスのキューが満杯になると I/O 動作を実行しようとしている他のプロセスはキューが使用できるようになるまでスリープ状態になります。要求はラウンドロビン方式で割り当てられ、1 つのプロセスが継続してキューのすべての領域を使用しないようにします。
I/O スケジューラー内の I/O 操作の最大数は nr_requests*2 です。前述のように、nr_requests は読み取りおよび書き込みに個別に適用されます。nr_requests は I/O スケジューラー内の I/O 操作にのみ適用され、基盤となるデバイスに既にディスパッチされている I/O 操作には適用されないことに注意してください。したがって、デバイスに対する未処理の I/O 操作の上限は (nr_requests*2)+(queue_depth) で、queue_depth/sys/block/sdN/device/queue_depth で、LUN キューの深さとも呼ばれます。たとえば、この未処理の I/O 操作の合計数は avgqu-sz 列の iostat の出力で確認できます。
optimal_io_size
このパラメーターで最適な I/O サイズを報告するストレージデバイスもあります。この値が報告される場合は、できるだけ報告された最適な I/O サイズに合わせその倍数の I/O をアプリケーションで発行させることを推奨しています。
read_ahead_kb
連続読み込み操作中にオペレーティングシステムが読み取ることができる最大キロバイト数を定義します。その結果、次のシーケンシャル読み取りに対し、必要となりそうな情報はカーネルページキャッシュ内にすでに存在するため、読み取りの I/O 操作が向上します。
多くの場合、デバイスマッパーは read_ahead_kb の値が高いという利点があります。マップする各デバイスに対して 128 KB の値が適切な開始点になりますが、read_ahead_kb の値を 4-8 MB に増やすと、大きなファイルのシーケンシャル読み取りが行われるアプリケーション環境でのパフォーマンスが向上する可能性があります。
rotational
一部のソリッドステートディスクは、ソリッドステートのステータスを正しく公開せず、従来の回転ディスクとしてマウントされます。ソリッドステートデバイスがこれを 0 に自動的に設定しない場合は、スケジューラーで不要な seek-reducing ロジックを無効にするように手動で設定します。
rq_affinity
デフォルトでは I/O 要求を発行したプロセッサーとは異なるプロセッサーで I/O の完了を処理することができます。rq_affinity1 に設定してこの機能を無効にし、I/O 要求を発行したプロセッサーでのみ完了を実行します。これによりプロセッサーのデータキャッシングの効率性が改善されます。
scheduler
特定のストレージデバイスにスケジューラーまたはスケジューラーの優先度を設定するには、/sys/block/devname/queue/scheduler ファイルを編集します。ここで、devname は設定するデバイスの名前に置き換えます。
# echo cfq > /sys/block/hda/queue/scheduler

8.4.4. deadline スケジューラーのチューニング

期限 が使用中の場合、キューに入れられた I/O 要求は読み取りまたは書き込みのバッチに分類され、LBA の増加順に実行がスケジュールされます。アプリケーションは読み取り I/O でブロックする可能性の方が高いため、デフォルトでは読み取りバッチの方が書き込みバッチより優先されます。バッチが処理されると、deadline は書き込み操作がプロセッサー時間を使い果たした時間を確認し、必要に応じて次の読み取りまたは書き込みバッチをスケジュールします。
以下のパラメーターは、deadline スケジューラーの動作に影響します。
fifo_batch
ひとつのバッチで発行する読み取りまたは書き込みの動作数です。デフォルト値は 16 です。値を高くするほど処理能力も高まりますが待ち時間も増加します。
front_merges
前方マージを生成しない場合は、このチューナブルを 0 に設定できます。ただし、このチェックのオーバーヘッドを測定していない限り、Red Hat はデフォルト値の 1 を推奨します。
read_expire
ミリ秒単位で指定します。この時間内に読み取り要求がスケジュールされます。デフォルト値は 500 (0.5 秒)です。
write_expire
ミリ秒単位で指定します。この時間内に書き込み要求がスケジュールされます。デフォルト値は 5000 (5 秒)です。
writes_starved
読み取りバッチ数を指定します。指定バッチ数を先に処理してから書き込みバッチをひとつ処理します。高い値を設定するほど読み取りバッチの方が多く優先して処理されます。

8.4.5. CFQ スケジューラーのチューニング

CFQ を使用するとプロセスはリアルタイム、ベストエフォート、アイドルの 3 種類いずれかのクラスに配置されます。リアルタイムのプロセスはすべてベストエフォートのプロセスより先にスケジュールされます。ベストエフォートのプロセスはすべてアイドルのプロセスより先にスケジュールされます。デフォルトではプロセスはベストエフォートのクラスに配置されます。ionice コマンドを使用すると、プロセスのクラスを手動で調整できます。
次のパラメーターを使用すると CFQ スケジューラーの動作をさらに調整することができます。これらのパラメーターは、/sys/block/devname/queue/iosched ディレクトリー配下の指定されたファイルを変更することで、デバイスごとに設定されます。
back_seek_max
CFQ に後方シークを行わせる最長距離をキロバイトで指定します。デフォルト値は 16 KB です。後方シークは特にパフォーマンスを低下さるため、大きな値の使用は推奨していません。
back_seek_penalty
ディスクヘッドで前方または後方への移動を決定する際に後方シークに対して適用する乗数を指定します。デフォルト値は 2 です。ディスクヘッドの位置が 1024 KB で、システムに等距離の要求がある場合(1008 KB および 1040 KB など)、back_seek_penalty が後方シーク距離に適用され、ディスクは前方に移動します。
fifo_expire_async
ミリ秒単位の長さで指定します。非同期 (バッファーされた書き込み) の要求を処理せず放置する長さです。この時間を過ぎると非同期の処理待ち要求が処理リストに移動されます。デフォルト値は 250 ミリ秒です。
fifo_expire_sync
同期(読み取りまたは O_DIRECT の書き込み)要求が処理されないままになる時間の長さ(ミリ秒単位)。この時間を過ぎると非同期の処理待ち要求が処理リストに移動されます。デフォルト値は 125 ミリ秒です。
group_idle
このパラメーターは、デフォルトで 0 (無効)に設定されます。1 (有効)に設定すると、cfq スケジューラーは、コントロールグループで I/O を発行している最後のプロセスでアイドリングします。これは、比例加重 I/O コントロールグループを使用し、slice_idle0 (高速ストレージ)に設定されている場合に役立ちます。
group_isolation
このパラメーターは、デフォルトで 0 (無効)に設定されます。1 (有効)に設定すると、グループ間のより強力に分離されますが、ランダムなワークロードと連続的なワークロードの両方に適用されるため、スループットが低下します。group_isolation が無効( 0に設定)の場合、連続したワークロードにのみ公平性が提供されます。詳細は、/usr/share/doc/kernel-doc-version/Documentation/cgroups/blkio-controller.txt にインストールされているドキュメントを参照してください。
low_latency
このパラメーターはデフォルトで 1 (有効)に設定されます。有効にすると、cfq は、デバイスで I/O を発行する各プロセスに最大 300 ミリ秒の待機時間を提供することで、スループットの公平性を優先します。このパラメーターを 0 (無効)に設定すると、ターゲットレイテンシーは無視され、各プロセスは完全なタイムスライスを受け取ります。
quantum
このパラメーターは、cfq が一度に 1 つのデバイスに送信する I/O 要求の数を定義します。基本的にはキューの深さを制限します。デフォルト値は 8 つの要求です。使用するデバイス側はより深いキューに対応している可能性はありますが、quantum の値を上げると待ち時間も増えます。特に大量の連続する書き込み作業負荷がある場合は顕著です。
slice_async
非同期の I/O 要求を発行している各プロセスに割り当てるタイムスライスの長さを指定します (ミリ秒単位)。デフォルト値は 40 ミリ秒です。
slice_idle
次の要求を待つあいだ cfq にアイドリングを行わせる長さをミリ秒単位で指定します。デフォルト値は 0 (キューまたはサービスツリーレベルではアイドリングなし)です。デフォルト値を使用すると外付け RAID ストレージでの処理能力が最適となりますが、シーク動作の総数が増加するため RAID ではない内蔵ストレージの場合には処理能力が低下します。
slice_sync
同期 I/O 要求を発行している各プロセスに割り当てるタイムスライスの長さをしていします (ミリ秒単位)。デフォルト値は 100 ミリ秒です。

8.4.5.1. 高速ストレージの CFQ のチューニング

高速な外部ストレージアレイやソリッドステートディスクなど、シークのペナルティーが大きいハードウェアでは cfq スケジューラーは推奨されません。このストレージで cfq を使用する必要がある場合、次の設定ファイルを編集する必要があります。
  • /sys/block/devname/queue/iosched/slice_idle0に設定します。
  • /sys/block/devname/queue/iosched/quantum64に設定します。
  • /sys/block/devname/queue/iosched/group_idle1に設定します。

8.4.6. noop スケジューラーのチューニング

noop I/O スケジューラーは、主に高速ストレージを使用する CPU バウンドシステムに役立ちます。また、一般的に noop I/O スケジューラーは、仮想ディスクに対して I/O 操作を実行するときに仮想マシンで使用されますが、排他的には使用されません。
noop I/O スケジューラーに固有の調整可能なパラメーターはありません。

8.4.7. パフォーマンス改善を目的としたファイルシステムの設定

本セクションでは Red Hat Enterprise Linux 7 で対応している各ファイルシステムに固有のパラメーターのチューニングについて説明しています。パラメーターはストレージデバイスのフォーマット時にパラメーターを設定する場合と、フォーマット化したデバイスのマウント時に設定する場合のいずれかに分けられます。
パフォーマンス低下の原因がファイルの断片化またはリソースの競合にある場合、一般的にはファイルシステムの再設定を行うことでパフォーマンスが改善されます。ただし、アプリケーションの変更を要する場合があります。このような場合にはカスタマーサポートに連絡してください。

8.4.7.1. XFS チューニング

本セクションではフォーマット時とマウント時に XFS ファイルシステムに使用できるチューニングパラメーターのいくつかについて説明します。
ほとんどの作業負荷で XFS のデフォルトフォーマットとマウント設定が適しています。この設定の変更は特定の作業負荷に必要な場合に限ってください。
8.4.7.1.1. フォーマットオプション
これらのフォーマットオプションの詳細については、man ページを参照してください。
$ man mkfs.xfs
ディレクトリーのブロックサイズ
ディレクトリーのブロックサイズは I/O 動作ごとに読み出したり修正したりするディレクトリー情報の量に影響を与えます。ディレクトリーブロックサイズの最小値はファイルシステムのブロックサイズになります (デフォルト 4 KB)。ディレクトリーブロックサイズの最大値は 64 KB です。
所定のブロックサイズの場合、サイズが大きいディレクトリーの方が小さいディレクトリーより多くの I/O を必要とします。またディレクトリーのブロックサイズが大きいシステムの方が小さいサイズより I/O 動作ごとの処理能力の消費量が高くなります。したがってディレクトリーのサイズ、ディレクトリーブロックサイズ共にできるだけ小さいサイズにすることを推奨しています。
Red Hat では 表8.1「ディレクトリーブロックサイズに対して推奨しているディレクトリーエントリーの最大数」 に示すディレクトリーブロックサイズで書き込みが多い作業負荷のエントリー数および読み取りが多い作業負荷のエントリー数を超えない設定を推奨しています。
ディレクトリーのブロックサイズによって異なる読み取りや書き込みの作業に与える影響については XFS 提供のドキュメントを参照してください。
ディレクトリーのブロックサイズを設定するには mkfs.xfs -l オプションを使用します。詳細は、man ページの mkfs.xfs を参照してください。
割り当てグループ
割り当てグループは独立した構造でファイルシステムのセクション全体に割り当てられている inode や空領域でインデックスを作成します。各割り当てグループは個別に修正できるため XFS による割り当て動作および割り当て解除の動作は影響するグループが異なる限り同時に行わせることが可能です。したがってファイルシステム内で実行可能な並列動作数は割り当てグループ数と同数になります。ただし、並列動作の実行は動作を行えるプロセッサー数によっても制限されるため割り当てグループ数はシステム内のプロセッサー数と同数またはそれ以上にすることを推奨しています。
ひとつのディレクトリーを複数の割り当てグループで同時に変更することはできません。したがって多数のファイルを作成したり削除するアプリケーションには一つのディレクトリーに全てのファイルを保存させないようにすることを推奨しています。
割り当てグループを設定するには mkfs.xfs -d オプションを使用します。詳細は、man ページの mkfs.xfs を参照してください。
増大に関する制約
フォーマットを行った後にファイルシステムのサイズを大きくする必要が生じた場合 (ハードウェアの追加やシンプロビジョニング)、一旦フォーマットを完了した割り当てグループのサイズは変更できないため初期のファイルレイアウトに十分注意してください。
割り当てグループのサイズ決定は初期のファイルシステム容量ではなく最終的な容量に応じて行ってください。完全に増大し切った状態のファイルシステムの割り当てグループ数はその最大サイズ (1 TB) に達しない限り 200 から 300 以内に収まるようにします。したがって、ほとんどのファイルシステムで増大可能な推奨最大サイズは初期サイズの 10 倍になります。
RAID アレイでファイルシステムを増大させる場合、新しい割り当てグループのヘッダーが追加したストレージに正しく合うようデバイスのサイズを割り当てグループサイズの倍数にする必要があるため更に注意が必要です。また、新しいストレージには既存ストレージと同じ配列を持たせる必要があります。フォーマット後は配列を変更することができないため、同じブロックデバイスに異なる配列のストレージがある場合は最適化が行えません。
inode とインライン属性
inode に十分な領域がある場合は inode への属性名と値の書き込みを XFS で直接行うことができます。こうしたインライン属性の読み出しや変更は余分な I/O が必要ないため別々の属性ブロックの読み出しに比べ 10 倍速くなります。
デフォルトの inode サイズは 256 バイトです。属性の格納に使用できるのはこのうちの約 100 バイトのみ、inode に格納されるデータエクステントポインター数により異なります。ファイルシステムをフォーマットする際に inode サイズを増やすと属性の格納に使用できる領域サイズが増加します。
属性名および属性値はいずれも最大サイズ 254 バイトに制限されています。属性名か属性値のいずれかの長さが 254 バイトを超えるとその属性は別の属性ブロックにプッシュされインラインには格納されなくなります。
inode パラメーターを設定するには mkfs.xfs -i オプションを使用します。詳細は、man ページの mkfs.xfs を参照してください。
RAID
ソフトウェア RAID を使用している場合は、mkfs.xfs が、適切なストライプユニットと幅で、基盤となるハードウェアを自動的に設定します。しかし、ハードウェア RAID を使用している場合はハードウェア RAID が必ずしもすべてこの情報をエクスポートするとは限らないため手作業によるストライプ単位とストライプ幅の設定が必要な場合があります。ストライプユニットと幅を設定するには、mkfs.xfs -d オプションを使用します。詳細は、man ページの mkfs.xfs を参照してください。
ログサイズ
保留中の変更はログに書き込みが行われる同期イベントの発生までメモリー内に集められます。ログのサイズにより同時に処理できる並列の変更数が決定します。また、メモリー内に集めることができる変更の最大サイズも決定するため、ログ記録したデータがディスクに書き込まれる頻度も決定されます。ログが小さいほどデータのディスクへの書き込み頻度は多くなります。ただし、大きいログはそれだけ保留中の変更を記録するため大きくのメモリーを使用するため、メモリーに制限があるシステムの場合はログを大きくしても意味がありません。
ログはベースとなるストライブの単位と合わせるとパフォーマンスが良くなります。つまり、ログがストライプ単位の境界線で開始や終了を行うためです。ログをストライプユニットに合わせるには mkfs.xfs -d オプションを使用します。詳細は、man ページの mkfs.xfs を参照してください。
ログサイズを設定するには、mkfs.xfs オプションを使用します。logsize はログのサイズに置き換えます。
# mkfs.xfs -l size=logsize
詳細は mkfs.xfs man ページをご覧ください。
$ man mkfs.xfs
ログのストライプ単位
RAID5 や RAID6 レイアウトを使用するストレージデバイスに書き込みを行うログの場合、ストライプ単位の境界線で書き込みの開始や終了を行わせるとパフォーマンスが良くなります (ベースとなるストライプ単位にあわせる)。mkfs.xfs は適切なログのストライプ単位を自動的に設定しようとしますが、この情報をエクスポートしている RAID デバイスにより異なります。
同期イベントが非常に頻繁に発生するような作業の場合、ログのストライプ単位を大きく設定するとパフォーマンスが低下する場合があります。書き込みが小さい場合、1 ログストライプのサイズを埋める必要があるため待ち時間が増えることがあるためです。ログ書き込みの待ち時間で制約を受ける作業の場合は、Red Hat では、ログのストライプ単位を 1 ブロックに設定して、アラインされていないログの書き込み開始を可能とすることを推奨しています。
対応しているログのストライプ単位の最大サイズはログのバッファーサイズの最大値です (256 KB)。これによりベースとなるストレージにログに設定できるストライプ単位より大きいストライプ単位を持たせることができます。この場合、mkfs.xfs は警告を発行し、ログストライプユニットを 32 KB に設定します。
ログのストライプ単位を設定するには以下のいずれかのオプションを使用します。N にはストライプ単位として使用するブロック数を入力します。size にはストライプ単位のサイズを KB で入力します。
mkfs.xfs -l sunit=Nb
mkfs.xfs -l su=size
詳細は mkfs.xfs man ページをご覧ください。
$ man mkfs.xfs
8.4.7.1.2. マウントオプション
Inode 割り当て
1 TB を超えるサイズのファイルシステムの場合、inode 割り当ての使用を強く推奨します。inode64 パラメーターは、ファイルシステム全体で inode とデータを割り当てるように XFS を設定します。これにより inode の多くがファイルシステムの先頭に割り当てられるのを防ぎ、データの多くがファイルシステムの後方に割り当てられるようになり、大きなファイルシステムのパフォーマンスが向上します。
ログのバッファーサイズと数
ログバッファーが大きいほどログにすべての変更を書き込む際に要する I/O 動作数が少なくなります。大きなログバッファーは I/O 使用が多い作業で非揮発性の書き込みキャッシュがないシステムのパフォーマンスを改善します。
ログのバッファーサイズは logbsize マウントオプションで設定され、ログバッファーに格納できる情報の最大量を定義します。ログのストライプ単位が設定されていない場合、バッファーの書き込みは最大値よりも短くなる可能性があるため、同期の多いワークロードのログバッファーサイズを縮小する必要はありません。ログバッファーのデフォルトサイズは 32 KB です。最大サイズは 256 KB です。これ以外に対応しているサイズは 64 KB、128 KB、または 32 KB から 256 KB のあいだのログストライプ単位の 2 の累乗の倍数です。
ログバッファーの数は、logbufs マウントオプションで定義されます。デフォルト値は 8 ログバッファー (最大) ですが最小では 2 ログバッファーを指定することができます。余分なログバッファーにメモリーを割り当てる余裕のないメモリー制約のあるシステム以外、通常はログバッファー数を減らす必要はありません。ログバッファー数を減らすとログのパフォーマンスが低下する傾向があります。特にログの I/O 待ち時間に制約のある作業に顕著に見られます。
変更のログ記録の遅延
XFS にはログに変更を書き込む前にメモリーにその変更を集めておくことができるオプションがあります。delaylog パラメーターを使用すると、頻繁に変更されるメタデータを、変更するたびにログに定期的に書き込みできます。このオプションを使用するとクラッシュで失う可能性のある動作数が増え、またメタデータの追跡に使用するメモリー量も増加します。ただし、メタデータの変更速度やスケーラビリティーが 10 倍向上されるため、fsyncfdatasync、または sync などを使用してデータとメタデータのディスクへの書き込みを確実に行わせる場合にデータやメタデータの整合性を損うことがありません。
マウントオプションの詳細は、man xfsを参照してください。

8.4.7.2. ext4 のチューニング

本セクションではフォーマットおよびマウント行う際に使用できる ext4 ファイルシステムのチューニングパラマーターについて説明します。
8.4.7.2.1. フォーマットオプション
Inode テーブルの初期化
ファイルシステム内のすべての inode を初期化するときに、非常に大きいファイルシステムではかなりの時間がかかる場合があります。デフォルトでは、初期化のプロセスは保留になります (レイジー inode テーブルの初期化が有効)。ただし、システムに ext4 ドライバーがない場合は、レイジー inode テーブルの初期化がデフォルトでは無効になります。lazy_itable_init を 1 に設定すると有効にできます。このような場合、カーネルのプロセスはファイルシステムがマウントされるとその初期化を続行します。
本セクションではフォーマット時に利用できる一部のオプションについてのみ説明しています。フォーマットパラメーターの詳細は mkfs.ext4 の man ページを参照してください。
$ man mkfs.ext4
8.4.7.2.2. マウントオプション
Inode テーブル初期化の割合
レイジー inode テーブルの初期化が有効になっている場合は、init_itable パラメーターの値を指定することで初期化が発生する速度を制御できます。バックグラウンドでの初期化にかかる時間はほぼ 1 をこのパラメーターの値で割った数値になります。デフォルト値は 10 です。
ファイルの自動同期
既存ファイル名の変更を行ったり、ファイルの短縮や書き直しをすると fsync が正しく動作しないアプリケーションがあります。ext4 の場合、デフォルトではこうした動作の後には必ず自動的にファイルの同期が行われます。ただしこのファイルの自動同期は時間がかかる場合があります。
ここまでの同期を必要としない場合はマウント時に noauto_da_alloc オプションを指定するとこの動作を無効にすることができますnoauto_da_alloc を設定する場合、データの整合性を確保するにはアプリケーション側で明示的に fsync を使用する必要があります。
ジャーナル I/O の優先度
デフォルトでは、ジャーナル I/O の優先度は 3 で、これは通常の I/O よりも若干高いです。マウント時に journal_ioprio パラメーターを使用して、ジャーナル I/O の優先度を制御できます。journal_ioprio の有効な値は 0 から 7 までで、0 は最も優先度が高い I/O です。
本セクションではマウント時に使用できる一部のオプションのみを説明しています。マウントオプションの詳細については mount の man ページをご覧ください。
$ man mount

8.4.7.3. Btrfs のチューニング

Red Hat Enterprise Linux 7.0 以降、Btrfs がテクノロジープレビューとして提供されています。チューニングは、現在の負荷に基づいてシステムを最適化するために常に行う必要があります。作成およびマウントのオプションについては、Red Hat Enterprise Linux 7 ストレージ管理ガイドのBtrfsの章を参照してください。

データ圧縮

デフォルトの圧縮アルゴリズムは zlib ですが、特定の負荷がある場合は、圧縮アルゴリズムを変更することが推奨されます。たとえば、ファイル I/O が大きいシングルスレッドの場合は、lzo アルゴリズムを使用することが推奨されます。マウント時オプションは次のとおりです。
  • compress=zlib: 圧縮率が高く、古いカーネルに安全なデフォルトオプション。
  • compress=lzo: 圧縮は高速ですが、zlib よりも低速です。
  • compress=no: 圧縮を無効にします。
  • compress-force=method: 動画やディスクイメージなどの圧縮率が高くないファイルにも圧縮を有効にします。利用可能な方法は zlib および lzo です。
マウントオプションの追加後に作成または変更されたファイルのみが圧縮されます。既存のファイルを圧縮するには、以下で methodzlib または lzo に置き換えたあとでこのコマンドを実行します。
$ btrfs filesystem defragment -cmethod
lzo を使用してファイルを再圧縮するには、次のコマンドを実行します。
$ btrfs filesystem defragment -r -v -clzo /

8.4.7.4. GFS2 のチューニング

本セクションではフォーマットおよびマウント行う際に使用できる GFS2 ファイルシステムのチューニングパラマーターについて説明します。
ディレクトリーの間隔
GFS2 マウントポイントの最上位レベルのディレクトリー内に作成されるディレクトリーはすべて自動的に間隔が置かれ、断片化を低減すると共にディレクトリー内での書き込み速度を速めています。最上位レベルのディレクトリーなどの別のディレクトリーを空けるには、以下のようにそのディレクトリーに T 属性でマークします。dirname は、スペースを空けるディレクトリーへのパスに置き換えます。
# chattr +T dirname
chattre2fsprogs パッケージの一部として提供されます。
競合を減らす
GFS2 はクラスター内のノード間で通信を必要とする可能性があるグローバルロックのメカニズムを使用します。複数のノード間でファイルやディレクトリーの競合が起きるとパフォーマンスの低下を招きます。複数のノード間で共有するファイルシステムの領域をできるだけ小さくすることでキャッシュ間の無効化を招く危険性を最小限に抑えることができます。