私は通常、使用tar zcvf
して圧縮し、使用して解凍しますtar zxvf
(習慣によりgzipを使用)。
最近、ハイパースレッディングを備えたクアッドコアCPUを入手したので、8つの論理コアがあり、多くのコアが圧縮/解凍時に使用されていないことに気付きました。
未使用のコアを使用して高速化する方法はありますか?
私は通常、使用tar zcvf
して圧縮し、使用して解凍しますtar zxvf
(習慣によりgzipを使用)。
最近、ハイパースレッディングを備えたクアッドコアCPUを入手したので、8つの論理コアがあり、多くのコアが圧縮/解凍時に使用されていないことに気付きました。
未使用のコアを使用して高速化する方法はありますか?
回答:
複数のコアでgzip圧縮を行うgzipの代わりにpigzを使用できます。-zオプションを使用する代わりに、それをpigzにパイプします。
tar cf - paths-to-archive | pigz > archive.tar.gz
デフォルトでは、pigzは使用可能なコアの数を使用します。それを照会できなかった場合は8を使用します。-pnを使用すると、より多くを要求できます(例:-p 32)。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
pvが見積もりを助けるのを好む、あなたはそれをスキップすることができます。しかし、それでも書きやすく覚えやすいです。
zstd
は、これを実行する最速のツールです。圧縮および解凍中の顕著なスピードアップ。tar -cf --use-compress-program=zstdmt
マルチスレッドでこれを行うために使用します。
tar
プログラムのオプションがあります:
-I, --use-compress-program PROG
filter through PROG (must accept -d)
マルチスレッドバージョンのアーカイバーまたはコンプレッサーユーティリティを使用できます。
最も一般的なマルチスレッドアーカイバは、(gzipの代わりに)pigzと(bzip2の代わりに)pbzip2です。例えば:
$ 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の場合、次のような小さなシェルスクリプトが必要です。
#!/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
オプションのプラス1 。これは最も単純でありながら効果的なアプローチです。
export XZ_DEFAULTS="-T 0"
xz圧縮のtar
オプション-J
を指定して呼び出す前は、魅力のように機能します。
-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
単純な文字列置換パラメーターです。アーカイブからファイルのパスを取り除き、解凍するとtarballのルートが現在のディレクトリになります。-C
ディレクトリの変更オプションを使用できないことに注意してくださいfind
。ディレクトリのすべてのファイルが含まれるため、次の利点が失われます。
-P
tar
絶対パスを使用するように指示するため、「メンバー名から先頭の「/」を削除する」という警告はトリガーされません。先頭の「/」は--transform
とにかく削除されます。
-cf -
tar
後で指定するtarball名を使用するように指示します
{} +
find
以前に見つかったすべてのファイルを使用します
pigz
pigz -9 -p 4
必要な数のパラメーターを使用します。この場合-9
は、圧縮レベルであり、圧縮-p 4
専用のコアの数です。負荷の高いWebサーバーでこれを実行する場合、おそらくすべての利用可能なコアを使用する必要はありません。
> myarchive.tar.gz
最後に。