比 tar 更快(未压缩)的归档工具?

比 tar 更快(未压缩)的归档工具?

我正在使用 tar 将一堆文件存档到 LTO-7 磁带。通常每个文件大约 1-2GB,每个存档中可以有数百个文件(每个存档最多约 1TB)。

目前,我正在使用以下方式存档:

tar -cvf /dev/nst0 --totals --warning=no-file-changed $OLDEST_DIR

磁盘的传输速度约为 90MBps,而磁盘的传输速度应为该速度的三倍(磁带的传输速度应为该速度的 2-3 倍)。仔细观察,我似乎受到 CPU 限制,因为 tar 100% 占用了一个 CPU。

这特别烦人,因为我试图通过首先执行此操作来验证存档的大小是否正确

tar -cP --warning=no-file-changed $OLDEST_DIR | wc -c

...然后比较生成的档案的大小。

那么,有没有更快的方法呢?

答案1

x86-64 CPU 的数据吞吐量约为 64GB/s,所以我认为这不是你的问题。这是 x86-64 Linux 还是其他什么?最有可能的问题是每个事务都完成了一些 CPU 工作,并且它使用的块太小。尝试:

strace -fo /tmp/tar.rw.txt -eread,write tar -cvf /dev/nst0 --totals --warning=no-file-changed $OLDEST_DIR

在生成的 /tmp/tar.rw.txt 文件中查看 tar 想要对 I/O 阻塞执行什么操作。您很可能会发现它读取和写入 10KB 块。您可以使用该-b标志来修复此问题,该标志默认为 20。我敢打赌您的硬件可以处理兆字节的 I/O,如果您的操作系统无法处理,则会将其拆分回来,因此请尝试-b $[1024*2*32]32MB 事务。

接下来,您应该检查操作系统想要对事务执行什么操作。尝试使用新-b值 tar ,确保已sysstat安装,并在运行时检查iostat -xm 4并观察计数器。主要要注意的是“avgrq-sz”列。如果没有进行拆分,则应该约为 64000。如果正在进行拆分,则您的操作系统认为它无法在一个事务中读取或写入那么多字节。这本身就是一个主题,但是您可以通过标记驱动器来快速提高限制(我认为 nst0 应该在那里),并且

cd /sys/block/nst0/queue
cat max_hw_sectors_kb > max_sectors_kb`

与您正在读取的磁盘的每一层(包括 lvm 和 dm 层)相同。它是批判的首先从最低(sda)级别增加 max_sectors_kb,最后从最高(例如 dm23)级别增加。递归地检查/sys/block/<dm>/holders/*/holders/*/.....

现在有了这些新设置,您必须注意两件事。一种是对原始文件进行 md5sum,从磁带 tar 和 untar,并检查 md5sum 以确保文件仍然正确记录。 -b不应该引起这样的问题,但我还没有测试你的磁带硬件等。第二个是确保你不会因为较大的事务大小而导致 RAM 不足。您可能需要确保 sysctl vm.min_free_kbytes 足够大,因为如果它在磁盘事务期间用完,就会发生非常糟糕的事情。

相关内容