ファイルをダウンロードし、パイプを介して解凍することは予想どおりに高速ではありません。

ファイルをダウンロードし、パイプを介して解凍することは予想どおりに高速ではありません。

リソースが限られており、遅延に非常に敏感な環境(CPU 1、コア2、128 MB 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.

おすすめ記事