事务 NTFS 的性能注意事项
事务 NTFS (TxF) 针对性能进行了精心设计,在类似情况下通常比常规用途事务性替代项性能更好。 但是,文件系统事务的开销高于非事务处理操作,并且与非事务处理 I/O 相比,I/O 性能会有所降低。 性能关键型应用程序应执行技术采用限定周期,评估事务处理文件系统操作的性能影响。
TxF 操作概述
如果发生事务中止,TxF 使用 撤消 日志记录来记录使文件系统恢复一致状态(也称为回滚)所需的更改。 与非事务性文件系统操作相比,此撤消日志记录会生成额外的 I/O,是 TxF 性能开销的来源。
TxF 操作方式的高级摘要如下:
- 事务进行时,TxF 会将 撤消 记录写入其日志文件中,以便对文件系统进行每次修改。 如果发生中止,将分析这些撤消记录,使文件系统恢复事务开始前的状态。
- 元数据更改撤消记录仅描述对文件系统元数据的更改。 其中一些示例包括移动、重命名、追加和属性更改。 对于元数据更改撤消记录,撤消更改所需的所有信息都存储在记录中,并存储在日志文件中。
- 覆盖撤消记录描述覆盖文件的一部分。 发生文件覆盖时,文件的原始内容存储在隐藏目录中的特殊撤消文件中,覆盖撤消记录指向此文件。 当文件更新最终从缓存刷新到磁盘时,还必须刷新撤消文件的内容,因此事务处理的文件覆盖最多可以生成两个额外的随机 I/O 操作:一个用于读取旧数据,另一个用于将其写入撤消文件。 这些额外的 I/O 操作是 TxF 的性能成本。
- 发生提交时,TxF 首先刷新所有撤消信息,然后刷新实际文件更改,然后写入并刷新提交记录。 如果没有要刷新的撤消文件,则相对于非事务处理 I/O 的唯一额外 TxF 开销是日志刷新本身。 但是,日志刷新会导致高效的大型顺序写入,因此性能成本最低。
- TxF 针对提交进行优化。 预计大多数事务都会成功,不需要回滚,因此,事务的所有撤消记录都应未使用。 从性能角度来看,TxF 提交操作速度很快,回滚会占用大量资源。
- 回滚比提交更占用资源。 在回滚期间,必须取消在事务中所做的所有更改。 通常,回滚持续时间可以大致与最初进行更改所花费的时间相同。 例如,如果进行所有更改需要 1 秒,则可能需要大约 1 秒才能撤消这些更改。 对于很长的事务,回滚可能会产生额外的性能影响。 例如,如果系统必须在系统停止响应且必须执行计划外重启的情况下自动回滚事务,则系统启动时间可能会延迟。
可以从上一个列表中得出的性能摘要结论如下:
- 对于涉及文件覆盖的事务,TxF 的性能成本可能很大。
- 对于仅涉及元数据操作的事务,TxF 的性能成本可能相对较低,前提是使用大型事务。 如果每个提交记录有多个撤消记录,则表示大型事务。
关于最佳性能的建议
对较大的事务摊销 TxF 开销。 例如,如果有 N 组更改要进行,其中每个更改都有 M 步骤,并且可以选择以每个 M 步骤的 N 个事务的形式执行此操作,或者使用 M*N 步骤作为单个事务执行所有这些操作,则后一个选项将更有效。
请考虑对超大型事务的启动可能产生的影响。 如前所述,如果系统需要将自动回滚作为启动时间执行,则回滚可能会很慢,并且会延迟启动时间。 事务越大,延迟越长。
将事务保留为元数据操作。 这是针对 TxF 进行优化的内容,通常,性能与大型元数据事务的非事务处理文件 I/O 大致相同。 高效元数据 TxF 函数的示例包括 MoveFileTransacted、 SetFileAttributesTransacted、 CopyFileTransacted、 DeleteFileTransacted、 CreateHardLinkTransacted 和追加写入 (文件指针作为文件末尾时对 WriteFile 函数的调用,或 EOF) 。 当文件指针不在 EOF 时,调用 WriteFile 函数是资源密集型非元数据操作的一个示例。
TxF 性能预期摘要
对于就地更新,覆盖到文件的某个部分的速度将比非事务处理的文件 I/O 慢得多,而文件系统元数据操作的 TxF 性能 (例如,创建、移动和追加) 相当于大型事务的非事务处理文件 I/O。