我通常使用来tar zcvf
压缩和解压缩tar zxvf
(由于习惯而使用gzip)。
我最近获得了带有超线程的四核CPU,因此我有8个逻辑核,而且我注意到在压缩/解压缩过程中许多核没有使用。
有什么办法可以利用未使用的内核来使其更快?
我通常使用来tar zcvf
压缩和解压缩tar zxvf
(由于习惯而使用gzip)。
我最近获得了带有超线程的四核CPU,因此我有8个逻辑核,而且我注意到在压缩/解压缩过程中许多核没有使用。
有什么办法可以利用未使用的内核来使其更快?
Answers:
您可以使用Pigz代替gzip,后者可以在多个内核上进行gzip压缩。除了使用-z选项,您还可以通过Pigz传递它:
tar cf - paths-to-archive | pigz > archive.tar.gz
默认情况下,pigz使用可用核心数,如果无法查询,则使用八个。您可以使用-pn来请求更多,例如-p32。pigz与gzip具有相同的选项,因此您可以使用-9请求更好的压缩。例如
tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
您也可以使用tar标志“ --use-compress-program =”来告诉tar使用哪种压缩程序。
例如使用:
tar -c --use-compress-program=pigz -f tar.file dir_to_zip
tar - dir_to_zip | pv | pigz > tar.file
光伏帮助我估算,您可以跳过它。但是仍然更容易编写和记忆。
zstd
是最快的工具。压缩和解压缩时的明显加速。用于tar -cf --use-compress-program=zstdmt
多线程。
有tar
程序选项:
-I, --use-compress-program PROG
filter through PROG (must accept -d)
您可以使用存档器或压缩器实用程序的多线程版本。
最流行的多线程的归档是pigz(而不是gzip)而且pbzip2(而不是bzip2的)。例如:
$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive
存档器必须接受-d。如果您的替代实用程序没有此参数,并且/或者您需要指定其他参数,请使用管道(必要时添加参数):
$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz
单线程和多线程的输入和输出兼容。您可以使用多线程版本进行压缩,也可以使用单线程版本进行解压缩,反之亦然。
对于用于压缩的p7zip,您需要一个小的shell脚本,如下所示:
#!/bin/sh
case $1 in
-d) 7za -txz -si -so e;;
*) 7za -txz -si -so a .;;
esac 2>/dev/null
将其另存为7zhelper.sh。这里是用法示例:
$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z
关于多线程XZ支持。如果您正在运行XZ Utils的5.2.0或更高版本,则可以通过环境变量XZ_DEFAULTS(例如)设置-T
或--threads
将其设置为适当的值,从而利用多个内核进行压缩XZ_DEFAULTS="-T 0"
。
这是5.1.0alpha版本的man片段:
多线程压缩和解压缩尚未实现,因此此选项目前无效。
但是,这对于解压缩尚未通过启用线程进行压缩的文件不起作用。从5.2.2版的man中:
线程解压缩尚未实现。它仅适用于包含多个块且文件标题中包含大小信息的文件。在多线程模式下压缩的所有文件都满足此条件,但是即使使用--block-size = size,也不会以单线程模式压缩的文件。
如果从源代码构建tar,则可以使用参数重新编译
--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip
使用以下选项重新编译tar后,您可以检查tar帮助的输出:
$ tar --help | grep "lbzip2\|plzip\|pigz"
-j, --bzip2 filter the archive through lbzip2
--lzip filter the archive through plzip
-z, --gzip, --gunzip, --ungzip filter the archive through pigz
pigz
)仅在从文件读取时才启用。实际上,处理STDIN可能会更慢。
xz
选择。这是最简单但有效的方法。
export XZ_DEFAULTS="-T 0"
在tar
使用-J
xz压缩选项进行调用之前,它就像是一种魅力。
您可以将快捷方式-I
用于tar的--use-compress-program
切换,并pbzip2
在多个内核上调用bzip2压缩:
tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors
`
如果要在文件名和压缩选项方面具有更大的灵活性,可以使用:
find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz
find
find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec
在此情况下/my/path/*.sql
,此命令将查找要存档的文件/my/path/*.log
。根据-o -name "pattern"
需要添加任意数量。
-exec
将使用以下结果执行下一条命令find
:tar
tar
tar -P --transform='s@/my/path/@@g' -cf - {} +
--transform
是一个简单的字符串替换参数。它将从存档中剥离文件的路径,以便压缩包的根成为提取时的当前目录。请注意,您不能使用-C
option来更改目录,因为您将失去的好处find
:将包含目录的所有文件。
-P
告诉tar
您使用绝对路径,因此不会触发警告“从成员名称中删除开头的'/'”。开头的“ /”始终被删除--transform
。
-cf -
告诉tar
我们使用我们稍后指定的tarball名称
{} +
使用find
以前找到的每个文件
pigz
pigz -9 -p 4
根据需要使用尽可能多的参数。在这种情况下-9
,压缩级别-p 4
是专用于压缩的核心数。如果在负载沉重的Web服务器上运行此程序,则可能不想使用所有可用的内核。
> myarchive.tar.gz
最后。