다음 파이프라인을 실행하고 있습니다.
tar -c directory | pv -T -c -B 2G | gzip -c9 | pv -T -c -B 2G | split -b 1G - /mnt/usbStick/f.tar.gz_
아이디어는 >4GB 디렉토리를 대형 FAT32 형식(<2GB 파일만 안정적으로 지원) USB 스틱에 gzip하는 것입니다. 그냥 1GB 청크 split
로 자르세요 ..gz
pv
파이프 버퍼(각 2GB)로 사용되며 주로 압축이 불량한 데이터가 발생할 때 제한을 방지하고 gzip
U 디스크 쓰기 속도보다 빠르게 압축된 데이터를 출력합니다.
질문:
또 다른 1GB 섹션이 완료되면 split
파일을 새로 고치고 닫습니다. 플러시가 완료될 때까지 다음 섹션 쓰기를 시작하지 않으므로 입력 수락이 중지됩니다.
이 시점에서 두 번째 2GB 버퍼가 채워지기 시작할 것으로 예상합니다.하지만 모든 게 멈췄어. 시스템은 전반적으로 완전히 죽지 않았지만 gzip
CPU 사용을 중지하고 pv
출력 업데이트도 중지합니다. 후반부부터는 모든 IO가, 심지어 파이프까지 멈췄다는 결론을 내렸습니다. (제가 틀렸다면 제가 틀렸다는 것을 증명해주세요.) (제가 틀렸습니다. 단지 특정 파이프라인이 멈춰 있는 것뿐입니다.)
문제는 왜 이렇게 작동하는지, 그리고 어떻게 해결하는지입니다.
편집하다
실제로 pv
결함이 있습니다. buffer
잘 작동합니다. Ubuntu 16.04에 포함된 빌드는 각각 최대 512KB의 블록을 최대 2048개까지만 사용할 수 있지만( buffer -m 1024m -s 512k
) 데이지 체인으로 연결하여 더 큰 버퍼를 형성할 수 있습니다.
답변1
단순한 모니터링 도구이기 때문에 pv
동기식 IO를 사용하는 단일 스레드 프로그램인 것으로 추측됩니다. 입력과 출력이 서로 다른 속도로 실행되는 경우 조절을 방지하기 위해 버퍼를 채우고 비우지만 파이프 중 하나가 완전히 중지되면(귀하의 경우 split
입력을 허용하지 않음) 호출 pv
중에 두 번째 인스턴스도 중지 write
. 그런 다음 gzip
더 많은 데이터를 출력하고 파이프 버퍼를 오버플로하여 중지하는 등 전체 파이프가 중지될 때까지 계속됩니다.
사용해 보세요buffer
이것이 도움이되는지 확인 하는 대신 pv
. buffer
두 개의 프로세스(입력용 하나, 출력용 하나)를 생성하고 출력이 완전히 중지되더라도 파이프를 계속 실행해야 합니다.