web-dev-qa-db-ja.com

XFSファイルシステムが突然多くのスペースを消費し、スパースファイルでいっぱいになるのはなぜですか?

XFS filesystems をさまざまなLinuxサーバー間でほぼ10年間データ/拡張パーティションとして実行しました。

最近のCentOS/RHELサーバーでバージョン6.2以降を実行していると、奇妙な現象に気づきました。

EL6.0およびEL6.1から新しいOSリビジョンへの移行後、安定したファイルシステムの使用は非常に変動しやすくなりました。 EL6.2 +で最初にインストールされたシステムは同じ動作を示します。 XFSパーティションでのディスク使用率の急激な変動を示しています(下のグラフのblue線を参照してください)。

前後。 6.1から6.2へのアップグレードは土曜日に行われました。xfs graph

同じシステムの過去の四半期のディスク使用量グラフで、先週の変動を示しています。enter image description here

大きなファイルや暴走したプロセス(ログファイルなど)がないかファイルシステムをチェックし始めました。最大のファイルがduおよびlsとは異なる値を報告していることを発見しました。 --apparent-sizeスイッチを付けて、または付けずにduを実行すると、違いがわかります。

# du -skh SOD0005.TXT
29G     SOD0005.TXT

# du -skh --apparent-size SOD0005.TXT
21G     SOD0005.TXT

ファイルシステム全体で ncduユーティリティ を使用して簡単に確認すると、次のようになります。

Total disk usage: 436.8GiB  Apparent size: 365.2GiB  Items: 863258

ファイルシステムは スパースファイル でいっぱいで、以前のバージョンのOS /カーネルと比較して約70GBの領域が失われています!

Red Hat Bugzilla を調べ、ログを変更して、XFSに関する同じ動作または新しいアナウンスの報告がないかどうかを確認しました。

なだ。

カーネルバージョン2.6.32-131.17.1.el6から2.6.32-220.23.1に変更しました。アップグレード中のel6;マイナーバージョン番号に変更はありません。

filefragツールでファイルの断片化をチェックしました。 XFSパーティション上の最大のファイルのいくつかには、数千のエクステントがありました。アクティビティの遅い期間中にxfs_fsr -vを使用してオンラインデフラグを実行すると、ディスク使用量が一時的に削減されました(上記の最初のグラフの水曜日を参照)。ただし、重いシステムアクティビティが再開するとすぐに使用量は増加します。

ここで何が起きてるの?

64
ewwhite

私はこの問題を2010年12月からの XFSソースツリー へのコミットに関する議論にさかのぼって追跡しました。このパッチはカーネル2.6.38で導入されました(そして、後にいくつかの人気のあるLinuxディストリビューションカーネルにバックポートされました)。

観察されたディスク使用量の変動は、新機能の結果です。 XFS Dynamic Speculative EOF事前割り当て

これは、ファイルサイズが大きくなると、投機的にスペースを割り当てることで、ストリーミング書き込み中のファイルの断片化を減らすための動きです。ファイルごとに事前に割り当てられるスペースの量は動的であり、主にファイルシステムで使用可能な空きスペースの関数です(スペースが完全になくなるのを防ぐため)。

このスケジュールに従います:

freespace       max prealloc size
  >5%             full extent (8GB)
  4-5%             2GB (8GB >> 2)
  3-4%             1GB (8GB >> 3)
  2-3%           512MB (8GB >> 4)
  1-2%           256MB (8GB >> 5)
  <1%            128MB (8GB >> 6)

これは、私が扱う非常に断片化されたファイルの一部に役立つ可能性があるため、ファイルシステムへの興味深い追加です。

追加のスペースは、ページキャッシュ、エントリ、およびiノードを次のように解放することで一時的に回収できます。

sync; echo 3 > /proc/sys/vm/drop_caches

ファイルシステムのマウント中にallocsize値を定義することにより、この機能を完全に無効にすることができます。 XFSのデフォルトはallocsize=64k

この変更の影響は、おそらく監視/しきい値システムによって感じられます(これが私がそれをどのように捉えたかです)が データベースシステム にも影響を及ぼし、シンプロビジョニングされた仮想マシンおよび予期しないまたは望ましくない結果を引き起こす可能性があります。ストレージアレイ(予想よりも多くのスペースを使用します)。

全体として、配布レベルでのファイルシステム変更の明確な発表がなかったため、または XFSメーリングリスト の監視でさえ、私は油断しました。


編集
この機能を備えたXFSボリュームのパフォーマンスが大幅に向上しました。以前は最大50%の断片化を表示していたボリュームで、一貫して<1%の断片化が発生しています。書き込みパフォーマンスがグローバルにアップしました!

同じデータセットからの統計。従来のXFSとEL6.3のバージョンを比較します。

古い:

# xfs_db -r -c frag /dev/cciss/c0d0p9
actual 1874760, ideal 1256876, fragmentation factor 32.96%

新着:

# xfs_db -r -c frag /dev/sdb1
actual 1201423, ideal 1190967, fragmentation factor 0.87%
78
ewwhite