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

나는 보통 사용하여 압축 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프로그램 옵션이 있습니다 :

-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


답변

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

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


답변

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

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

드디어.


답변

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


답변