파일을 다운로드하고 파이프를 통해 압축을 푸는 것이 예상만큼 빠르지 않습니다.

파일을 다운로드하고 파이프를 통해 압축을 푸는 것이 예상만큼 빠르지 않습니다.

리소스가 제한되어 있고 지연 시간에 매우 민감한 환경(CPU 1개, 코어 2개, 128MB RAM이 있는 VM)에서 가능한 한 빨리 파일을 다운로드하고 압축을 풀어야 합니다.

물론, 다운로드하는 동안 압축을 풀 수 있다는 가정 하에 다운로드 프로세스를 압축 풀기 프로세스에 연결해 보았습니다. 가장 느린 프로세스에 의해 파이프가 막힌 것으로 알고 있습니다. 이 문제를 극복하기 위해 다운로드와 압축 해제 프로세스 사이에 버퍼를 사용했습니다.

내 쉘 스크립트는 다음과 같습니다.

curl -s $CACHE_URL | buffer -S 100M | lz4 -d > /tmp/myfile

zip 파일을 먼저 다운로드한 후 파이프를 사용하지 않고 압축을 풀면 다운로드에 약 250ms가 걸리고, 순차적으로 하면 압축 해제에 약 250ms가 걸립니다.

따라서 내 가설은 파이프라인 접근 방식이 그 사이에 추가 디스크 읽기가 없고 다운로드가 압축 해제만큼 CPU에 제한되지 않으므로 그다지 영향을 미치지 않기 때문에 약 250-275ms가 걸릴 것이라는 것입니다.

그러나 그것은 진실이 아니다. 내 로그에 표시된 것처럼 약간 더 빠릅니다.

Start download  
35211K,      81131K/s
Download & decompressed done in 447ms

Starting individual download & decompress
Download done in 234ms
Decompressed : 61 MiB  
                                                                               
/tmp/myfile        : decoded 75691880 bytes 
Decompress done in 230ms

내가 여기서 잘못 생각하고 있는 걸까? 속도를 높이는 다른 방법이 있나요?

답변1

간단히 말해서: 귀하의 명령을 테스트해 본 결과 내 컴퓨터에서 작동하는 것 같습니다. 최소 다운로드 + 압축 해제 시간은 약 800ms +이며, 스크립트가 버퍼를 사용하는 최소 시간은 700ms입니다.

댓글에서 이미 제안한 대로 가상 머신의 CPU가 병목 현상을 일으키는지 확인하려면 다른 하드웨어에서 스크립트를 테스트하는 것이 좋습니다. 이제 이 "답변"이 여러분에게 얼마나 도움이 될지는 모르겠지만, 어쨌든 여기에 있습니다.

먼저 16K 블록과 32M mem 블록을 사용하여 Stéphane의 제안을 테스트하고 훨씬 더 나은 결과를 보고했습니다(약 60% 더 빠름).

$ cat compressed.lz4 | buffer -S 100M | lz4 -d > /tmp/myfile
      11858K,     104017K/s
$ cat compressed.lz4 | buffer -s 16K -m 32M -S 100M | lz4 -d > /tmp/myfile
      11858K,     162438K/s

그러나 명령을 테스트한 후 다음을 수행하십시오.

curl -s http://192.168.24.105/compressed2.lz4 | buffer -S 100M | lz4 -d > /tmp/myfile

더 나은 결과아니요버퍼 매개변수를 변경합니다.

또한 lz4를 사용하여 파일을 저장하면(/dev/null로 출력하지 않고) 약 100밀리초의 시간이 추가된다는 사실도 확인했습니다.

나는:

file: 70MB
download time: ~700ms (minimum of 650ms)
decompress and save to /dev/null: ~160ms - 220ms
decompress and save to /tmp/file: ~310ms
decompress and save to a tempfs: ~300ms (slightly better??)
test.bash: ~700ms - 1000ms
test2.bash: ~1100ms, minimum recorded of 800ms

사용된 스크립트: 다운로드.bash

start=`date +%s%3N`
curl -s http://192.168.24.105/compressed2.lz4 >/dev/null
end=`date +%s%3N`
echo Execution time was `expr $end - $start` milliseconds.

unzip.bash

start=`date +%s%3N`
lz4 -d /home/pi/compressed2.lz4 > /dev/null
end=`date +%s%3N`
echo Execution time was `expr $end - $start` milliseconds.

test.bash

start=`date +%s%3N`
curl -s http://192.168.24.105/compressed2.lz4 | buffer -S 100M | lz4 -d > /tmp/myfile
end=`date +%s%3N`
echo Execution time was `expr $end - $start` milliseconds.

test2.bash

start=`date +%s%3N`
curl -s http://192.168.24.105/compressed2.lz4 | buffer -s 128K -m 32M | lz4 -d > /tmp/myfile
end=`date +%s%3N`
echo Execution time was `expr $end - $start` milliseconds.

관련 정보