Linuxの断片化に関する真実
「Linuxは決して断片化しない」というのは、技術界隈で最も一般的な噂の一つです。実際、EXT4、XFS、Btrfsなどのファイルシステムは非常にスマートにブロックを管理します。これらはデータを連続して配置し、速度を最適化しようと努めます。しかし、「スマート」であることは「完璧」であることを意味しません。
私は以前、CentOS 7上でSQLデータベースと24時間365日のログ記録を実行しているサーバークラスターを担当したことがあります。2年後、ディスク使用率は80%に達したばかりでしたが、I/O速度が150MB/sから40MB/s未満に低下しました。調査したところ、ログファイルが5,000以上の断片(fragments)に分割されていました。適切なログローテーションが行われていないと、HDDのヘッドが頻繁に移動する必要が生じ、レイテンシ(遅延)が急増してアプリケーションのレスポンスが極端に遅くなっていました。
次のような場合には、デフラグ(最適化)を検討する必要があります:
- 空き容量が15%未満になり、システムが連続した空きブロックを見つけるのが困難になった場合。
- メールサーバーやログサーバーのように、データの書き込み・削除が頻繁に行われるタスクを実行している場合。
- 従来のHDD(ハードディスクドライブ)上でシステムが動作している場合。
ツールの準備
Ubuntu、Debian、AlmaLinuxなどの主要なディストリビューションの多くは、これらのディスク管理ツールを標準で備えています。もしインストールされていない場合は、e2fsprogs(EXT4用)とxfsprogs(XFS用)パッケージをインストールするだけで済みます。
Ubuntu/Debianの場合:
sudo apt update && sudo apt install e2fsprogs xfsprogs -y
RHEL/CentOS/AlmaLinuxの場合:
sudo yum install e2fsprogs xfsprogs -y
ディスクの「乱れ」具合を測定する
すぐにデフラグコマンドを実行してはいけません。この作業はCPUとI/Oリソースを大幅に消費します。まずは現在の状況を確認し、介入が必要かどうかを判断しましょう。
1. EXT4システムの場合
ディスク全体の空き領域の状況を確認するには、e2freefragを使用します:
sudo e2freefrag /dev/sda1
データベースファイルなどの重要なファイルを詳しく調査したい場合は、filefragが最適です:
sudo filefrag -v /var/lib/mysql/ibdata1
extentsカラムに注目してください。1つのファイルに対してこの数値が数百に達している場合は、パフォーマンスに関する危険信号です。
2. XFSシステムの場合
XFSでは、xfs_dbツールを使用して読み取り専用モードで素早くチェックできます:
sudo xfs_db -c frag -r /dev/sdb1
実務上の経験から言うと、10%未満であれば安定していますが、この数値が20%を超えるとシステムの動作が重くなり始めるのが目に見えてわかります。
安全なデフラグ方法
極めて重要な注意点:**SSDに対してHDDと同じ方法でデフラグを行わないでください**。SSD上で頻繁にデータを移動させると、書き込み回数(P/Eサイクル)を浪費し、ドライブの寿命を縮めるだけです。SSDの場合は、fstrimコマンドを使用するだけで十分です。
e4defragによるEXT4の処理
e4defragの最大の利点は、オンラインで実行できることです。ドライブをアンマウントしたりサービスを停止したりする必要がないため、高い稼働率が求められるサーバーに非常に適しています。
特定のディレクトリの断片化率を確認します:
sudo e4defrag -c /var/www/html/
「Fragmentation score」が30を超えている場合や、パーティションの拡張後にパフォーマンスが低下した際は、断片化の解消(デフラグ)を実行しましょう:
# 大容量ファイルのデフラグを実行
sudo e4defrag /var/lib/mysql/data_file.dbf
# パーティション全体のデフラグを実行
sudo e4defrag /dev/sda1
xfs_fsrによるXFSの処理
XFSはxfs_fsr(Filesystem Reorganizer)を使用します。このツールは非常にスマートで、まず整理されたデータを含む一時ファイルを作成し、その後に古いファイルと入れ替えることでデータの安全性を確保します。
# XFSパーティション全体を最適化
sudo xfs_fsr /dev/sdb1
自動化と監視
サーバーが動かなくなるまで待つのではなく、オフピーク時に定期的にチェックするスクリプトを設定しましょう。以下は、私がよく午前3時に実行するように設定しているcronジョブの例です。
スクリプト optimize_disk.sh を作成します:
#!/bin/bash
# ログディレクトリ의 断片化スコアを取得
SCORE=$(e4defrag -c /var/log | grep "Fragmentation score" | awk '{print $3}')
# スコアが30を超えている場合のみデフラグを実行
if [ "$SCORE" -gt 30 ]; then
echo "$(date): スコア $SCORE が高すぎます。最適化を実行中..." >> /var/log/defrag_history.log
e4defrag /var/log
fi
SSDを使用している場合は、systemdでシステムが不要なデータブロックを自動的にクリーンアップできるように、fstrimを有効にするのを忘れないでください:
sudo systemctl enable --now fstrim.timer
システム管理とは、単にインストールすることだけではなく、サーバーのパフォーマンス最適化を長期的に維持することでもあります。ファイルシステムの仕組みを深く理解することは、RAMやCPUのアップグレードだけでは解決できない「速度の病」を治療するのに役立ちます。

