我最近正在致力于优化性能tar -xf
,即解压文件。
我注意到,在默认设置下,tar -xf
调用write
s 一次以块的形式写入 10 KiB 输出。然而,在我们当前的设置下(使用O_DIRECT
带有 I/O 的标志进行闪存存储),这会导致严重的存储损失。
有没有办法增加tar
写入输出文件的块大小?我正在使用-b
参数,并注意到如果我这样做tar -b 512 -xvf
,性能会提高2x
。在这种情况下这是有效的用法吗? (这些tar
文件是在默认设置下创建的。)
我还能做些什么来提高吞吐量吗tar
?
答案1
tar 中的选项-b
用于控制 tar 写入设备的块大小,因此这正是您想要的。但-b 512
关于手册页 tar(1) 意味着块大小为 512*512 = 262144。所有块大小都是有效的,您的设备(您将 tar 输出写入其中)可以处理。在历史上,tar 命令最初是为不同的磁带驱动器编写的,因此需要这样做。
答案2
所有 tar 实现都存在性能问题,但自 1990 年以来内置于 star 中的star
已解决。FIFO
Star 默认情况下会创建一个 8MB 的 FIFO,这有助于提高性能,因为 Star 还会分叉成两个进程。一个进程读取存档,另一个进程执行tar
提取任务。如果您使用现代操作系统并使用现代磁带设备,我建议指定更大的 FIFO 大小,最多为机器物理内存的一半。查看star fs=
选项。对于现代磁带驱动器,我建议fs=256M
更多。这极大地减少了当无法实现流式磁带模式时因重新定位磁带而导致的常见磁带磨损问题。
如果您使用真实的磁带设备,则需要在创建时增加块大小。请注意,为了磁带的可移植性,不应使用大于 6kB 的块大小。如果您的本地操作系统和驱动器支持更大的块大小(而不仅仅是增加的 FIFO 大小),请使用更大的值(请参阅星号手册页)。
请注意,如果您使用 ZFS 等写入时复制文件系统,或者您使用的操作系统具有缓慢的文件系统缓冲区实现(如 Linux),您可能希望切换star
到insecure mode
仅适用于gtar
.通过添加来做到这一点-no-fsync
。在 Solaris 和ufs
星型默认安全模式上,性能降低了不到 10%,在 ZFS 和慢速 Linux 缓冲区实现上,此安全模式使性能降低了 400%。