トランザクション NTFS のパフォーマンスに関する考慮事項
トランザクション NTFS (TxF) は、パフォーマンスを考慮して慎重に設計されており、通常は、同様のシナリオで汎用トランザクションの代替手段よりも優れたパフォーマンスを発揮します。 ただし、ファイル システム トランザクションは、非トランザクション操作よりもオーバーヘッドが多く、非トランザクション I/O と比較して I/O パフォーマンスの低下が予想されます。 パフォーマンスクリティカルなアプリケーションでは、テクノロジ導入の認定サイクルを実行し、トランザクションファイル システム操作のパフォーマンスへの影響を評価する必要があります。
TxF 操作の概要
TxF は 元に戻す ログ記録を使用して、トランザクションの中止が発生した場合にファイル システムを一貫した状態 (ロールバックとも呼ばれます) に戻すために必要な変更を記録します。 この元に戻すログは追加の I/O を生成し、非トランザクション ファイル システム操作と比較して TxF パフォーマンスオーバーヘッドの原因となります。
TxF の動作の概要は次のとおりです。
- トランザクションが進行すると、TxF は、ファイル システムに加えた変更ごとに 、元に戻す レコードをログ ファイルに書き込みます。 中止が発生した場合、これらの元に戻すレコードが解析され、トランザクションが開始される前の状態にファイル システムが戻されます。
- メタデータ変更の元に戻すレコードは、ファイル システムのメタデータに対する変更のみを記述します。 この例としては、移動、名前の変更、追加、属性の変更があります。 メタデータ変更の元に戻すレコードの場合、変更を元に戻すために必要なすべての情報はレコード内にあり、ログ ファイルに格納されます。
- 上書き元に戻すレコードは、ファイルの一部の上書きを表します。 ファイルの上書きが行われると、ファイルの元の内容は隠しディレクトリの特殊な元に戻すファイルに格納され、上書き元に戻すレコードはこのファイルを指します。 ファイルの更新が最終的にキャッシュからディスクにフラッシュされる場合は、元に戻すファイルの内容もフラッシュする必要があります。そのため、トランザクションファイルの上書きによって、古いデータを読み取る操作と元に戻すファイルに書き込む操作という最大 2 つの余分なランダム I/O 操作が生成される可能性があります。 これらの追加の I/O 操作は、TxF のパフォーマンス コストです。
- コミットが発生すると、TxF は最初にすべての元に戻す情報をフラッシュしてから、実際のファイルの変更をフラッシュしてから、コミット レコードを書き込んでフラッシュします。 フラッシュする元に戻すファイルがない場合、トランザクションされていない I/O に対する追加の TxF オーバーヘッドは、ログ自体だけです。 ただし、ログ フラッシュを使用すると、大規模なシーケンシャル書き込みが効率的になり、パフォーマンス コストが最小限に抑えられます。
- TxF はコミット用に最適化されています。 ほとんどのトランザクションは成功し、ロールバックする必要はないため、トランザクションのすべての元に戻すレコードは使用されないことが予想されます。 パフォーマンスの観点からは、TxF コミット操作は高速であり、ロールバックはリソースを集中的に消費します。
- ロールバックは、コミットよりもリソースを集中的に消費します。 ロールバック中に、トランザクションで行われたすべての変更を実行解除する必要があります。 一般に、ロールバック期間は、最初に変更を加えるのにかかったのとほぼ同じになります。 たとえば、すべての変更を行うのに 1 秒かかった場合、元に戻すのに約 1 秒かかる場合があります。 トランザクションが非常に長い場合は、ロールバックによってパフォーマンスへの影響が増す可能性があります。 たとえば、システムが応答を停止し、予定外の再起動を実行する必要がある場合に、システムがトランザクションを自動的にロールバックする必要がある場合、システムの起動時間が遅れる可能性があります。
前の一覧から引き出すことができるパフォーマンスに関する概要の結論は次のとおりです。
- ファイルの上書きに関連するトランザクションの TxF のパフォーマンス コストが大きくなる可能性があります。
- メタデータ操作のみを含むトランザクションの TxF のパフォーマンス コストは、大規模なトランザクションを使用する場合、比較的低い可能性があります。 大きなトランザクションは、コミット レコードごとに多くの元に戻すレコードがある場合です。
最適なパフォーマンスのための推奨事項
より大きなトランザクションに対する TxF オーバーヘッドを償却します。 たとえば、各変更に M ステップがある場合に行う変更セットが N 個あり、M ステップのN 個のトランザクションとして実行するか、MNステップで* 1 つのトランザクションとして実行するかを選択できる場合、後者のオプションの方が効率的です。
非常に大きなトランザクションの起動に与える可能性のある影響を考慮してください。 前述のように、ロールバックが遅くなる可能性があり、システムが自動ロールバックをブート時間として実行する必要がある場合は、起動時間が遅くなる可能性があります。 トランザクションが大きいほど、遅延が長くなります。
トランザクションは主にメタデータ操作に保持します。 これは TxF 用に最適化されたものであり、一般に、パフォーマンスは、大規模なメタデータ トランザクションの非トランザクション ファイル I/O とほとんど同じです。 効率的なメタデータ TxF 関数の例としては、 MoveFileTransacted、 SetFileAttributesTransacted、 CopyFileTransacted、 DeleteFileTransacted、 CreateHardLinkTransacted、および追加された書き込みがあります (ファイルポインターがファイルの最後にある場合に WriteFile 関数を呼び出す、 EOF)。 リソースを集中的に使用する非メタデータ操作の例として、ファイル ポインターが EOF にない場合の WriteFile 関数の呼び出しがあります。
TxF パフォーマンスの期待値の概要
インプレース更新の場合、ファイルのセクションへの上書きは、トランザクションされていないファイル I/O よりもはるかに遅くなりますが、ファイル システム メタデータ操作 (作成、移動、追加など) の TxF パフォーマンスは、大きなトランザクションの場合は、トランザクションされていないファイル I/O に相当します。