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