2016-06-28 22 views
1

マスターbashスクリプト内で「並列化」しようとしている複数のbashスクリプトがあります。Unix環境でのマルチスレッド/パラレルbashスクリプト

バッシュスクリプト:私は(アンパサンドなし)通常のスクリプトを実行しているし、アンパサンドで、私は何かがないかもしれないと信じて私をリードし、処理時間の任意のかなりの違いを見ていないです

#!/bin/bash 
SHELL=/bin/bash 

bash /home/.../a.sh & 
bash /home/.../b.sh & 
wait 
bash /home/.../c.sh & 
bash /home/.../d.sh & 
bash /home/.../e.sh & 
wait 
echo "Done paralleling!" 
exit 0 

最も効率的な方法で正しくコーディングされています。

+0

パラレルインスタンスは、必ずしもすべて同じ物理リソースを使用しているため、* longer *を取ることができます。これはおそらく、ディスクドライブ)。 Linux *(et al)*は非常に効率的なバッファリングをシーンの裏で使用できるので、* single *プロセスインスタンスはI/O要求をより効率的に行うことができるかもしれませんが、 "埋め込まれていれば、多くのプロセスが同じことを多かれ少なかれ実行しています。単にそれをベンチマークするだけで、アンパサンドが実際にあなたのマシン上で物事をかなり速くすることができなければ、そのアイデアを放棄してください。 * "ああ、いいアイデアのように思えたけど..." * –

+0

並列ジョブでもっと勉強したい人は、GNU Parallelを見てみてください。それはあなたのための並列化作業の多くを行い、生産品質です。 –

答えて

1

古典的なコンピュータサイエンス理論では、リソース競合は「スラッシング」と呼ばれます。

(5メガバイトのディスクドライブは小さな洗濯機のサイズかもしれませんが、私たちはMaytag洗濯機のように見えるので、「Maytagモード」と呼んでいました。

競合に起因するパフォーマンスカーブをグラフ化すると、上向きに傾き、突然「エルボー」シェイプが現れます。が指数関数的に上がります。私たちはそれを「壁に当たって」と呼びます。

このスクリプトでは、面白いことに(ちょうど興味があれば...)はいくつかの場所にwait文を入れることです。 (これを正しく実行していることを確認してください)2つのインスタンスを実行し、それらのすべてが完了するのを待ってから3回以上繰り返されるようにします。それが有益に速いかどうかを確認し、そうであれば3回試してみてください。等々。あなたは "スイートスポット"を見つけるかもしれません。

そうではありません。

1

可能性があります。並列処理を使用すると、複数のリソースを同時に使用することができます。そのリソースがあなたの制限要因である場合には、スピードが向上します。

たとえば、ディスクから読み込んでいる場合は、ディスクからの読み込みの処理があなたを制限していることがうかがいます。並行して処理することは効果的ではありません。実際には、競合によってプロセスを遅くする。 (ディスクは、「立ち上げ」と読み込みをシリアライズするのではなく、複数のプロセスにサービスを提供する必要があります)。

実際にあなたのスクリプトが実際にを実行し、なぜそれが遅いのかがわかります。そしてそれをチェックする最良の方法は、それをプロファイリングすることです。

基本的なレベルでは、trussやstraceのようなものが役に立ちます。

strace -fTtc /home/../e.sh 

システムコールの種類と消費している時間の合計を確認します。

関連する問題