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
멀티스레딩 옵션을 사용하면 -T0
xz에게 한 번에 두 가지를 알릴 수 있습니다. MT를 사용한다는 것은 다음을 의미합니다.기다리다모든 입력(데이터)이 메모리로 읽혀질 때까지 "병렬" 압축이 시작됩니다.
테스트를 통합한 후 단계별로 성능을 분석합니다 pigz
. 100M 파일이 있습니다 f100
.
$ time xz -c f100 >/dev/null
real 0m2.658s
user 0m2.573s
sys 0m0.083s
99%의 시간이 하나의 코어를 압축하는 데 소비됩니다. -T4
(또는 )을 사용하여 -T0
4개의 코어를 모두 활성화합니다.
$ 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보다 조금 더 빠르게 얻을 수도 있습니다.