GNU tar阻塞因子、块、记录和检查点

2020-08-27 06:53:47

我希望不是这样,但是GNU tar手册并不总是容易解析的,也不一定在所有主题上都是完整的。

在现代磁带机中有效使用GNU tar的一个常见障碍是理解如何使用阻塞因子和检查点特性。首先,让我们以抽象的递增顺序定义一些术语,因为它们与GNU tar一起使用:

GNU tar中的块是512字节长的数据单元,无论块大小对任何底层存储设备可能意味着什么。

记录由一个或多个块组成。在给定的归档中,每条记录中的块数由块因子设置。当tar写入存档文件(或通过管道、磁带等)时,它总是一次写入一条完整的记录。

当一个输入文件被tar读取并存储在存档中时,它将被转换为一条或多条记录的序列。所需的记录数取决于文件的大小,但每个文件始终至少有一条完整的记录。

当前GNU tar的默认阻塞因子是20,不过您可以使用您自己的安装来验证这一点:

通过将默认阻塞因子20乘以一个数据块的大小(以字节为单位),我们可以得知TAR将一次写入我们的磁带10240字节,或一次写入10 KiB。

这在遥远的过去和预期以特定记录大小发送数据的磁带机中可能是有意义的,但是现代LTO-7磁带机应该以每秒300 MiB左右的速度写入,以实现最高效率。在缺省阻塞因子下,这意味着tar必须每隔0.03毫秒左右完成一条记录并开始一条新记录。

现代驱动器还接受很大范围的块大小用于写入,想必这些大小不再强烈对应于磁带介质的物理布局:

#dmesg-t|grep";块限制";st 6:0:1:0:[st0]块限制1-8388608字节。

在使用GNU tar和现代磁带机创建磁带存档时,将阻塞因子(选项-b)增加到1024或2048会显著提高吞吐量,并且更容易达到所需的300MiB/秒数据速率。这分别对应于512 KiB或1 MiB的记录大小。

与任何存储吞吐量优化一样,重要的是对所有更改进行基准测试,以确保它们带来实际的改进,尽管1024可能是开始测试的好地方。

由于tar操作可能运行时间较长,因此在操作期间获得有关进度的反馈可能会很有用。

GNU tar有几种方法可以提供这种反馈,但是对于将tar集成到大型操作(例如备份管理系统)中,EXEC方法提供了很大的灵活性。

此方法将导致tar在操作时定期执行外部程序,并使用有关进度状态的信息设置某些环境变量。

TAR_CHECKPOINT环境变量只是记录为检查点的";号,其确切含义很简单。

就我从读取源代码(在src/Buffer.c中调用checkpoint_run(),增加检查点变量)可以看出,每写入一条记录,tar_checkpoint就会递增,因此要将检查点编号转换为写入或读取的字节数:

默认阻塞因子为20,检查点配置为每百条记录,第一个检查点将是检查点100,此时已写入1013760字节(99条记录,每条记录20个数据块)。第二个检查点将为200,此时将写入2037760个字节,依此类推。