
CentOS 6.6システムでひどく断片化されたXFSファイルシステムを最適化しようとしています。
[root@server opt]# xfs_db -c frag -r /dev/md3
actual 598, ideal 215, fragmentation factor 64.05%
ただし、ユーティリティを起動しようとすると、xfs_fsr
次のメッセージで終了しますNo improvement will be made (skipping)
。
[root@server opt]# xfs_fsr -t 25200 /dev/md3 -v
/opt start inode=0
ino=536871105
No improvement will be made (skipping): ino=536871105
デフラグを実行するにはどうすればよいですか?
答え1
修正する
検査後xfs_fsrのソースコード私が見つけた部分はこんな感じです。
/* Check if the temporary file has fewer extents */
new_nextents = getnextents(tfd);
if (dflag)
fsrprintf(_("Temporary file has %d extents (%d in original)\n"), new_nextents, cur_nextents);
if (cur_nextents <= new_nextents) {
if (vflag)
fsrprintf(_("No improvement will be made (skipping): %s\n"), fname);
free(fbuf);
close(tfd);
return 1; /* no change/no error */
}
(デバッグフラグ)を使用してコマンドを再実行しましたが、次の-d
ものが返されました。
xfs_fsr /dev/md1 -v -d
/mnt/disk1 start inode=0
ino=133
ino=133 extents=4 can_save=3 tmp=/mnt/disk1/.fsr/ag0/tmp23917
DEBUG: fsize=30364684107 blsz_dio=16773120 d_min=512 d_max=2147483136 pgsz=4096
Temporary file has 4 extents (4 in original)
No improvement will be made (skipping): ino=133
つまり、HDDプラッタ内の元のファイルは4つのファイル部分で構成され、作成された新しいデフラグファイルはまだ4つのファイル部分で構成されているため、このファイルをスキップしました。しかし、なぜマージできないのですか?わからないので、kernel.org bugzillaにお問い合わせください。。
アップデート2
返信をいただきました。私のXFSファイルシステム(そしておそらくあなたのシステムも同様)のブロックサイズは4 KBなので、ファイル部分の最大サイズは8 GBを超えることはできません。XFS ドキュメントに記載されているとおり:
ファイル長が0バイトの場合、拡張領域はなく、di_nblocksとdi_nexentsは0になります。データを含むすべてのファイルには少なくとも1つの範囲があり、各範囲はファイルシステムで100万から200万を超えるブロックを使用できます(221)。デフォルトの4KBブロックサイズファイルシステムの場合、単一のエクステント長は最大8GBです。
したがって、「改善は行われない」とは、「改善が不可能」を意味する。 ;)
元の答え
私は同じ問題があり、発見しました。xfs_fsr がデフラグをスキップすることがよくあります。:
* mandatory locks are present
* file is marked immutable, append-only, or nodefrag
* filesystem is shut down
* change/modify times have been altered since defrag started
* original file is mmapped
使用されている場合は-v
スキップxfs_fsr
されたファイルのinode番号を返します。
xfs_fsr /dev/md1 -v
/mnt/disk1 start inode=0
ino=133
No improvement will be made (skipping): ino=133
ino=135
No improvement will be made (skipping): ino=135
....
このinode番号を使用すると、次のようにbmap -a
ファイルのプロパティを確認できますxfs_db
。
xfs_db -r /dev/md3
xfs_db> inode 133
xfs_db> bmap -a
xfs_db> bmap -d
data offset 0 startblock 1314074773 (4/240332949) count 2097151 flag 0
data offset 2097151 startblock 1316171924 (4/242430100) count 2097151 flag 0
data offset 4194302 startblock 1318269075 (4/244527251) count 2097151 flag 0
data offset 6291453 startblock 1320366226 (4/246624402) count 1121800 flag 0
xfs_db> quit
ご覧のとおり、私の場合は属性フラグがないため、null値を返します。
そこで次にロック状態を確認してみました。最初に私たちはinodeのファイル名を取得します。次のように:
find /mnt/disk1 -xdev -inum 133
/mnt/disk1/foo/bar.dat
それから私たちは試してみましたロック状態の取得:
lsof /mnt/disk1/foo/bar.dat
結果が空で、ファイルをロックする内容はないようです。
それでは、最後の最適化の試み以降にファイルが変更されたことを確認しましょう。
ls -l /mnt/disk1/foo/bar.dat
-rw-rw-rw- 1 nobody users 30364684107 Nov 18 2019 /mnt/disk1/foo/bar.dat
いいえ、まだ「古い」ようです。