ext4を超えて:SSDとSDカードのパフォーマンスを最大限に引き出すF2FSの最適化

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

フラッシュストレージにF2FSが不可欠な理由

ext4はLinuxファイルシステムの信頼できる「古参」ですが、もともとは回転するプラッタとメカニカルヘッドの時代に構築されたものです。これをRaspberry PiのSDカードやハイエンドのNVMe SSDで使用することは、最新のシリコンに20年前のハードディスクの動作を強いるようなものです。F2FS(Flash-Friendly File System)は、NANDフラッシュメモリ特有のジオメトリに合わせて特別に設計されています。

私がF2FSに移行したきっかけは、エッジデバイスでSDカードの故障が相次いだことでした。数年にわたり数十台のLinuxノードを管理してきた経験から、F2FSは書き込み増幅(Write Amplification)を最大40%削減できることが分かりました。私のRaspberry Pi 4クラスターでは、この切り替えにより、一般的なSanDisk製カードの寿命が、継続的なログ記録環境下で6ヶ月から2年近くまで延びました。

はじめに:環境の準備

環境を整えましょう。ほとんどのディストリビューションにはF2FSユーティリティがプリインストールされていないため、手動で取得する必要があります。

1. 必須ツールのインストール

Ubuntu、Debian、またはRaspberry Pi OSユーザーの場合:

sudo apt update
sudo apt install f2fs-tools

Fedoraを実行している場合:

sudo dnf install f2fs-tools

2. パーティションのフォーマット

警告: このプロセスにより、対象パーティションのすべてのデータが消去されます。続行する前に、必ずlsblkを使用してドライブのパスを再確認してください。

# /dev/sdb1 を対象のパーティションに置き換えてください
sudo mkfs.f2fs -l f2fs_storage /dev/sdb1

3. ドライブのマウント

sudo mkdir -p /mnt/f2fs_data
sudo mount /dev/sdb1 /mnt/f2fs_data

これでF2FSパーティションが有効になりました。しかし、デフォルト設定はあくまで始まりに過ぎません。実世界でのメリットを享受するには、カーネルがハードウェアと対話する方法を調整する必要があります。

ログ構造化方式の利点

F2FSはログ構造化ファイルシステムとして動作します。データを頻繁に上書きするext4とは異なり、F2FSは可能な限り新しいブロックにデータを書き込みます。この戦略はNANDフラッシュに最適です。フラッシュメモリは、ブロック全体を消去してからでないと1ビットも上書きできないため、F2FSはシーケンシャルに書き込むことで、これらの破壊的な消去サイクルを最小限に抑えます。

知っておくべきパフォーマンス機能

  • マルチヘッド・ロギング: データを「ホット」「ウォーム」「コールド」の階層に分類します。頻繁に変更されるログと静的なシステムファイルを分離することで、ガベージコレクションを大幅に効率化します。
  • インラインデータ: 小さなファイルをinode内に直接保存します。これにより、別のデータブロックを探す必要がなくなり、小さなファイルの操作が約15%高速化されます。
  • アダプティブ・シフティング: ディスクが一杯になるにつれて書き込み戦略を動的に変更し、パフォーマンスの低下を防ぎます。

高度なチューニング:圧縮と寿命

ハイエンドのNVMeや最新のSDカードを使用している場合は、デフォルトのマウントオプションで満足しないでください。透過的圧縮を有効にすることは、ドライブの早期故障を防ぐための最良の方法です。

1. 透過的圧縮の有効化

圧縮により、フラッシュチップに書き込まれるデータの物理的な量が削減されます。私は、高い圧縮率と低いCPU負荷のバランスが優れたZSTDアルゴリズムを推奨します。私の経験では、ZSTDによりデータベースのログファイルを50%以上縮小できました。

これを有効にするには、特定の追加属性を指定してドライブをフォーマットする必要があります:

sudo mkfs.f2fs -O extra_attr,compression,ext_attr /dev/sdb1

永続的で最適化されたマウントを行うには、以下のオプションを/etc/fstabに追加します:

/dev/sdb1 /mnt/f2fs_data f2fs defaults,noatime,compress_algorithm=zstd,compress_chksum,atgc 0 0

注:バックグラウンドでのクリーンアップを向上させるため、カーネル5.13以降で利用可能な atgc(非同期ガベージコレクション)を追加しました。

2. ガベージコレクタ(GC)の微調整

ディスクアクティビティが高い時にシステムがカクつく(スタッターが発生する)場合、ガベージコレクタが受動的すぎる可能性があります。sysfs経由でステータスを確認できます:

cat /sys/fs/f2fs/sdb1/gc_urgent

この値を1に設定すると、システムがアイドル状態のときに削除済みブロックのクリーンアップを優先するようカーネルに指示します。これにより、高速なバースト書き込みに備えて常にクリーンなブロックを確保できます。

3. 「デンジャーゾーン」:チェックポイントの無効化

大規模なソフトウェアのコンパイルや一時的なデータ処理など、特定のワークロードではチェックポイントを無効にできます。これによりfsyncのボトルネックが解消されますが、リスクが伴います。停電が発生した場合、直近数秒間のデータが失われる可能性があります。

sudo mount -o remount,checkpoint=disable /mnt/f2fs_data

長期メンテナンス戦略

フラッシュストレージは無敵ではありません。最高のファイルシステムであっても、ピーク時の速度を維持するには多少のメンテナンスが必要です。

15%ルール

F2FSがガベージコレクション中にデータブロックを移動させるには「余裕(呼吸スペース)」が必要です。容量が90%を超えると、通常パフォーマンスは急落します。私は常にドライブ의少なくとも15%を空けておくようにしています。内部セグメントのステータスは、次のコマンドで監視できます:

f2fs_io status /mnt/f2fs_data

アクセス時間の書き込みを停止する

常にnoatimeマウントフラグを使用してください。デフォルトでは、Linuxはファイルを読み込むたびにメタデータを更新します。SDカードでは、これにより単純な「読み取り」が摩耗を引き起こす「書き込み」に変わってしまいます。これは安価なフラッシュストレージにとってサイレントキラーとなります。

手動TRIM操作

F2FSはインテリジェントですが、週に一度手動でTRIMを実行することで、コントローラーが未使用のブロックを特定するのに役立ちます。これは、使用中に煩わしいレイテンシのスパイクを引き起こす可能性があるdiscardマウントオプションを使用するよりも、多くの場合で優れています:

sudo fstrim -v /mnt/f2fs_data

F2FSへの切り替えは、フラッシュストレージ上で動作するLinuxシステムに対して実行できる、最もインパクトのある変更の一つです。レガシーな形式から脱却し、特定のハードウェアに合わせて調整することで、よりきびきびとしたインターフェースと、予想よりも数年長く持つハードウェアを手に入れることができるでしょう。

Share: