리소스가 제한되어 있고 지연 시간에 매우 민감한 환경(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.