FS: XFS Part1

容量

 最大 8EiB (32bits linux: 16TiB)

 

ジャーナリング

 ファイルシステムへの変更が発生した場合は、直列化されたジャーナルに書き込まれたあと、実ブロックの更新が行われる。

  書き込み操作が発生すると、

 1. オペレーションのログとしてメタ・データの更新操作情報がメモリ上のバッファ

に書き込まれ、

 2. バッファのデータが、非同期でディスクに書き込まれると、

 3. ジャーナルファイルとなる。

 ジャーナルファイルの書き込みが完了すると、リソースをディスクに書き込む。

 

 ジャーナルログの構造

  メモリ上のバッファに書き込まれるログは in-core log と呼ばれ、FIFOの構造で、ログの記録されているオペレーションは、アクティブオペレーションと呼ばれている。

 ディスクに書き込まれるログは on-disk log と呼ばれ、環状のキュー構造をしている。このログに記録されているオペレーションは、コミットされたオペレーションと呼ばれている、また環状構造のため、キュー末尾にある最も古いログエントリは、新しいログエントリに上書きされる。

 ディスクへのログの書き込み回数を減らすために、in-core log 上の複数のアクティブオペレーションは、ログレコードというグループにまとめられ、アクティブレコードとして、on-disk log に書き込まれるまで、in-core log 内に保存される。ディスクに書き込まれたログレコードは、コミットされたログレコードとしてあつかわれる。

 in-core log から on-disk log への書き込みトリガ
 ・in-core log のキューが満杯に近づいたとき

 ・ディスクへの書き込みを要求するリクエストがあったとき

 ・内部的なタイムアウトが発生したとき

 

トランザクションによるジャーナルログ書き込み

 トランザクションアロケーション

 トランザクションの際に最初に行うのは、トランザクション構造体と一意なトランザクション識別子の割り当てだる。

 トランザクション構造体は、重要なイベントやトランザクションに関連した情報の記録に使用される。

 トランザクション識別子は、on-disk log 内のトランザクションに関連したデータに対して割り付けられる。

 ログスペースの確保

 in-core log があふれないように、トランザクションを行うために必要なログスペースの確保を行う。

 トランザクションが使用する in-core log のスペースが足りない場合は、そのトランザクションは待ち状態になるか、キャンセルされる。

 in-core log のデータがディスクにフラッシュされ、そのデータが in-core  log のキューから削除されると、削除されたスペースは新たなログスペースとして使用できる。

 リソースロック

 バッファや i node といったリソースの読み込みやロックを行う。

 リソースの修正、オペレーションの明示

 リソースがロックされると、そのリソースに対して修正を行うことができる。この段階で、オペレーションを記録するために使用するトランザクションオペレーション構造体が作られる。トランザクションオペレーション構造体は、システムがクラッシュした場合に復旧コードによって使用されるオペレーションを記録するもの。

 コミットトランザクション

 リソースに対して必要な変更が、すべて完了したとき、トランザクションはコミットされる。

 トランザクションコミットでは、すべてのリソースの修正情報やトランザクションオペレーションを in-core log に記録する。

 リソースの修正が in-core log にコミットされると、トランザクションがロックしているすべてのリソースを開放する。

 この時点で、更新データはメモリ上にあるため、トランザクションは永久的なものになっていない。

 ログ書き込み完了

 in-core log がディスクに書き込まれた時点で、トランザクションは永久的なものとなる。これらは、トランザクションの過程で自動的に行われる。

 また、このときトランザクション構造体も開放される。

 修正されたリソースのフラッシュ

 修正を含んだログの書き込みが完了すると、そのリソースは、ディスクにフラッシュされる。

 

 設定

 ジャーナルログの変更

 ジャーナルログのサイズを大きくすることで、削除時のパフォーマンスが向上する。

  mkfs.xfs -l size=64m /dev/<device>

 ログバッファ数の変更

 ログバッファの数を大きくすることで、削除時のパフォーマンスが向上する。

  mount -o logbufs=8 /dev/<device> /xxx/yyy

 ログバッファサイズの変更

 ログバッファサイズを大きくすることで、ジャーナルにアクセスする割合を減らすことができる。

  mount -o logsize=256k /dev/<device> /xxx/yyy

 ログ遅延

 ジャーナルログに書き込むのを遅延させることで、ジャーナルにアクセスする割合を減らすことができる。

  mount -o delaylog /dev/<device> /xxx/yyy

 nobarrier

 書き込みキャッシュは I/O のパフォーマンス向上として設計されていますが、書き込みバリアを有効にすることは、これらのキャッシュを連続的にフラッシュするということであり、これにより大幅なパフォーマンス低下が生じる可能性がある。

 ジャーナルログを別デバイスに置く

 xfsを /dev/sda、ジャーナルログを、/dev/ssd、ログサイズ(block size)を4096にした場合

  mkfs.xfs -lo logdv=dev/ssd,size=4096 /dev/sda

 既存のパーティションのログを外部ログにする場合は、まず、外部ログようのパーティションを初期化、xfs_db にて xfs パーティションのパラメターを書き換え、マウントする。

  dd if=/dev/zero of=/dev/sda1 bs=1M count=4096

  xfs_db -x /dv/sda1

  xfs_db > sb 0

  xfs_db > print

  xfs_db > write logstart 0

  xfs_db > write logblocsk 1024000

  xfs_db > q

  mount -t xfs -o logdev=/dev/sda1 /xxx/yyy

 以前の設定に戻したい場合

  xfs_repair /dev/sda3

 リサイズ

  xfs_growfs /partition

 マウントオプション

  noatime, nobarrier, logbufs=8, logbsize=256k, allocsize=2M