gzip, pv 및 파이프가 포함된 멀티스레드 xz - 이것이 내가 얻을 수 있는 가장 효율적인 것입니까?

gzip, pv 및 파이프가 포함된 멀티스레드 xz - 이것이 내가 얻을 수 있는 가장 효율적인 것입니까?

xz이제 멀티스레딩이 지원된다는 사실을 알게 되어 기쁩니다 .

xz --threads=0

하지만 이제는 최대한 활용하고 싶습니다. 예를 들어 gzip을 xz로 다시 압축하려면 다음을 수행하세요.

gzip -d -k -c myfile.gz | pv | xz -z --threads=0 - > myfile.xz

이로 인해 프로세서 사용량이 더 높아졌습니다(xz당 CPU 약 260%, 예!).

하지만:

  • gzip아직 멀티스레딩이 아니라는 것을 알고 있습니다 .
  • pv파이프 나 파이프라인이 (IO?) 스레드 수를 제한할 수 있다고 생각합니다 .

이거 진짜야? 그렇다면 보다 효율적으로 만들 수 있는 방법이 있습니까(삭제 이외 pv)?

답변1

멀티스레딩 옵션을 사용하면 -T0xz에게 한 번에 두 가지를 알릴 수 있습니다. MT를 사용한다는 것은 다음을 의미합니다.기다리다모든 입력(데이터)이 메모리로 읽혀질 때까지 "병렬" 압축이 시작됩니다.

테스트를 통합한 후 단계별로 성능을 분석합니다 pigz. 100M 파일이 있습니다 f100.

$  time xz -c  f100 >/dev/null

real  0m2.658s
user  0m2.573s
sys   0m0.083s

99%의 시간이 하나의 코어를 압축하는 데 소비됩니다. -T4(또는 )을 사용하여 -T04개의 코어를 모두 활성화합니다.

$  time xz -c -T4 f100 >/dev/null

real  0m0.825s
user  0m2.714s
sys   0m0.284s

전체 결과: 300% 더 빠르며 코어당 거의 선형적입니다. "사용자" 값은 4로 나누어야 하며 이것이 보고/정의되는 방식입니다. "sys"는 이제 약간의 오버헤드를 보여줍니다. 실제로는 사용자 1/4에 sys를 합친 것입니다.

$  time gzip     -dc f100.gz >/dev/null
$  time pigz -p4 -dc f100.gz >/dev/null

이는 0.5초 대 0.2초입니다.

$  time pigz -dc -p4 f100.gz | xz -c -T4 >out.xz

real  0m0.902s
user  0m3.237s
sys   0m0.363s

...0.8 + 0.2 = 0.9 감소.

그리고여러 파일, 그러나 너무 많지는 않지만 4개의 ​​셸 백그라운드 프로세스를 통해 얻을 수 있는 가장 높은 전체 병렬성입니다. 여기서는 대신 4개의 25M 파일을 사용합니다.

for f in f25-?.gz; do time pigz -p4 -dc "$f" | xz -c -T0 >"$f".xz & done

심지어 0.7초 더 빨라진 것 같습니다. 멀티스레딩이 없어도 다음의 경우에도 마찬가지입니다 xz.

for f in f25-?.gz; do time gzip -dc "$f" | xz -c >"$f".xz & done

를 사용하여 간단한 쿼터파이프 4개를 설정하는 것만으로도 를 &사용한 것과 동일하게 0.8초를 얻을 수 있습니다 xz -T4.

xz내 시나리오에서 멀티스레딩을 활성화하는 것은 전체 파이프라인을 병렬화하는 것만큼 중요합니다. 이를 Pigz 및/또는 여러 파일과 결합할 수 있으면 개별 단계 합계의 1/4보다 조금 더 빠르게 얻을 수도 있습니다.

관련 정보