tar + gzip / bzip 압축 / 압축 해제를위한 멀티 코어 활용


225

나는 보통 사용하여 압축 tar zcvf하고 압축을 해제합니다 tar zxvf(습관으로 인해 gzip 사용).

최근에 하이퍼 스레딩이 포함 된 쿼드 코어 CPU를 얻었으므로 8 개의 논리 코어가 있으며 압축 / 압축 해제 중에 많은 코어가 사용되지 않는 것을 알 수 있습니다.

사용하지 않는 코어를 활용하여 더 빠르게 만들 수있는 방법이 있습니까?


위에서 Xiong Chiamiov가 제안한 솔루션은 아름답게 작동합니다. 방금 .tar.bz2로 랩톱을 백업했으며 단 하나의 CPU 스레드를 사용하는 데 132 분이 걸렸습니다. 그런 다음 소스에서 tar를 컴파일하고 설치했습니다. gnu.org/software/tar 구성 단계에서 언급 한 옵션을 포함했습니다. ./configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzip 백업을 다시 실행했는데 32 분 밖에 걸리지 않았습니다. 그것은 4 배 향상보다 낫습니다! 시스템 모니터를보고 전체 4 CPU (8 스레드)를 항상 100 %로 평평하게 유지했습니다. 그게 가장 좋은 해결책입니다.
워렌 세브린

답변:


309

여러 코어에서 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

3
동일한 방식으로 pigz를 어떻게 압축 해제합니까? 아니면 압축에만 작동합니까?
user788171

42
pigz는 압축 해제를 위해 다중 코어를 사용하지만 단일 코어에 비해 개선이 제한적입니다. 수축 형식은 병렬 압축 해제에 적합하지 않습니다. 감압 부분은 연속적으로 수행되어야합니다. pigz 압축 해제를위한 다른 코어는 CRC를 읽고 쓰고 계산하는 데 사용됩니다. 다른 한편으로 압축 할 때, pigz는 n 개의 코어 로 n 개 개선 요소에 가깝습니다 .
Mark Adler

7
여기 하이픈은 표준 출력입니다 ( 이 페이지 참조 ).
Garrett

3
예. 양방향으로 100 % 호환됩니다.
Mark Adler

4
타르 링에 소비 된 CPU 시간이 사실상 없기 때문에 별 도움이되지 않습니다. tar 형식은 파일 사이에 헤더 블록이있는 입력 파일의 사본 일뿐입니다.
Mark Adler

324

tar 플래그 "--use-compress-program ="을 사용하여 tar에 사용할 압축 프로그램을 알려줄 수도 있습니다.

예를 들어 다음을 사용하십시오.

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 

21
이것은 지식의 굉장한 작은 덩어리이며 더 많은 찬사를받을 가치가 있습니다. 이 옵션이 존재하는지 전혀 몰랐으며 수년에 걸쳐 매뉴얼 페이지를 몇 번 읽었습니다.
랜달 헌트

2
@ ValerioSchiavoni : 여기가 아니라 4 개의 코어 (Ubuntu 15.04 'Vivid')에 완전히로드됩니다.
bovender

8
나는 tar - dir_to_zip | pv | pigz > tar.filepv가 나를 평가 하는 데 도움이되는 것을 선호 합니다. 그러나 여전히 쓰고 기억하기가 더 쉽습니다.
Offenso

@ NathanS.Watson-Haigh 그렇습니다. 프로그램 이름과 인수를 따옴표로 묶으십시오. man tar그래서, 같은 난데 .
Marc.2377

1
2020 년에 zstd가장 빠른 도구입니다. 압축 및 압축 해제 중 눈에 띄는 속도 향상. tar -cf --use-compress-program=zstdmt멀티 스레딩과 함께 사용하십시오 .
옥로드

112

일반적인 접근법

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

압축을위한 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 지원과 관련하여. XZ Utils 버전 5.2.0 이상을 실행중인 경우 환경 변수 XZ_DEFAULTS를 통해 적절한 값 으로 설정 -T하거나 압축하여 여러 코어를 압축 할 수 있습니다 --threads(예 :XZ_DEFAULTS="-T 0" .

이것은 5.1.0alpha 버전의 사람 조각입니다.

멀티 스레드 압축 및 압축 해제는 아직 구현되지 않았으므로이 옵션은 현재 적용되지 않습니다.

그러나 스레딩이 활성화 된 상태에서 압축되지 않은 파일의 압축 해제에는 작동하지 않습니다. 버전 5.2.2의 man에서 :

스레드 압축 해제가 아직 구현되지 않았습니다. 블록 헤더에 크기 정보가있는 여러 블록이 포함 된 파일에서만 작동합니다. 멀티 스레드 모드로 압축 된 모든 파일은이 조건을 충족하지만 --thread-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

1
이것이 실제로 가장 좋은 대답입니다. 나는 나의 타르를 확실히 재건 할 것이다!

1
방금 pbzip2mpibzip2를 찾았 습니다 . mpibzip2는 클러스터 또는 랩톱 및 멀티 코어 데스크톱 컴퓨터가있는 경우 매우 유망합니다.

이것은 훌륭하고 정교한 답변입니다. 멀티 스레드 압축 (예 :로 pigz)은 파일에서 읽을 때만 활성화 된다는 것을 언급하는 것이 좋습니다 . STDIN 처리 속도가 느려질 수 있습니다.
oᴉɹǝɥɔ

3
xz옵션은 플러스 1입니다 . 가장 간단하면서도 효과적인 방법입니다.
selurvedu

2
export XZ_DEFAULTS="-T 0"xz 압축 tar옵션 -J을 호출하기 전에 매력처럼 작동합니다.
scai

13

-Itar --use-compress-program스위치 바로 가기 를 사용하고 pbzip2여러 코어에서 bzip2 압축을 호출 할 수 있습니다 .

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/

@MaximSuslov의 답변에 대한 좋은 TL; DR .
einpoklum

이것은 tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors
Arash

1

파일 이름 및 압축 옵션을보다 유연하게 사용하려면 다음을 사용할 수 있습니다.

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

1 단계: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

이 명령은 보관하려는 파일을 찾습니다 (이 경우) /my/path/*.sql 및)/my/path/*.log . -o -name "pattern"원하는만큼 추가하십시오 .

-exec다음 결과를 사용하여 다음 명령을 실행합니다 find.tar

2 단계: tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transform간단한 문자열 대체 매개 변수입니다. 압축을 풀 때 tarball의 루트가 현재 디렉토리가되도록 아카이브에서 파일의 경로를 제거합니다. 사용할 수 없습니다-C다음과 같은 이점을 잃을 옵션을 하여 디렉토리를 변경할find . 디렉토리의 모든 파일이 포함됩니다.

-Ptar절대 경로를 사용하도록 지시 하므로 "멤버 이름에서 선행`/ '제거"경고가 트리거되지 않습니다. 다음으로 제거되는 선행 '/'--transform어쨌든 .

-cf - 알려줍니다 tar나중에 지정할 tarball 이름을 사용하도록 합니다.

{} + 모든 파일을 사용 find이전 찾은 모든

3 단계 : pigz

pigz -9 -p 4

원하는만큼 매개 변수를 사용하십시오. 이 경우-9 압축 수준은-p 4 압축 전용 코어 수입니다. 로드가 많은 웹 서버에서이를 실행하는 경우 사용 가능한 모든 코어를 사용하지 않을 수 있습니다.

4 단계 : 이름 보관

> myarchive.tar.gz

드디어.


0

고려할 수있는 비교적 최신 (압축) 압축 도구는 zstandard 입니다. 스페어 코어를 활용하는 훌륭한 작업을 수행하며 압축 비율 대 압축 해제 시간과 관련하여 상당한 절충안을 만들었습니다. 또한 압축 비율 요구에 따라 크게 조정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.