2012-02-09 12 views
6

私はPerlフォークを新たに発見しました。私はかなり恋しています。しかし、一つのことが私に関係しています。もし私がちょうど左右のプロセスを分割しているなら、確かにこれはどこかの問題を引き起こすでしょう。私の小さなアプリケーションが私のマシンのすべてのリソースを使い切っていないことを確認するために使用すべき妥当な種類のチェックがありますか?Perl - 担当フォーク

このサンプルコードください:

foreach my $command (@commands) { 
    my $pid = fork(); 
    if (!$defined $pid) { 
    #Fork failed. Do something. 
    } elsif ($pid == 0) { #This is the child. 
     system($command); 
     exit(0) 
    } 
} 

while (wait() != -1) {} #wait() will be -1 when the last child exits. 

だから、これは正常に動作し、各コマンドを処理するためのプロセスをオフに産卵しますが。これらのコマンドが完全に独立しているとすばらしいことです。

突然実行するコマンドが5,000以上ある場合はどうなりますか?多くのプロセスを無意識のうちにフォークすることは賢明ではありません。だから、どんな種類のチェックを実施すべきか、そしてどのようにしたらいいですか?

+1

あの提供「待つ*」APIを介して、あなたのために終了した子プロセスを刈り取りの世話をするあなたはフォークしてきたどのように多くのトラックを保持し、最大で停止されますのでご注意くださいだから、あなたはマシンを殺さずにすぐに非常に怒っているシステム管理者が午前3時に起床するのですか? ;) –

+0

妥当な "max"はなんですか? – Jeremy

+2

あなたが行ったところで 'system'を呼び出すのは馬鹿です。 'system'は基本的に' fork' + 'exec'(子)+' waitpid'(親)です。 'system'を' exec'に変更してください。 – ikegami

答えて

7

:したがって、このスニペットは殺されるまで無限にCPUを消費4つのプロセス---厄介な、小さな爆弾を作成します。

自分自身をロールする( "to fork"するためにキューを使用する)か、コンストラクタパラメータで同時にフォークを制限できるParallel::ForkManagerモジュールを使用することをお勧めします。

use Parallel::ForkManager; 
$pm = new Parallel::ForkManager($MAX_PROCESSES); 

ForkManagerも、

+0

これは行く方法のように聞こえる!ありがとう。 – Jeremy

3

子供は親にSIG_CHLDを送り返すために起こって終了します。スクリプトの最後にwaitへの最後の呼び出しまでプロセステーブルのゾンビになることがないかのように、これらの恩恵を受ける必要があります。

Chapter 16 of O'Reilly's Perl Cookbook on Google booksは、これに関する情報を提供します。基本的には、子供をフォークしているときはカウンターを増やし、刈り取っているときはカウンターを減らし、現在稼働している子供の合理的な最大値を超えて新しいカウンターをフォークする必要はありません。

"合理的な最大値"は、ハードウェアとフォークされたプロセスが何をしているかによって異なります。あなたがやっていることをテストし、マシンへのパフォーマンスへの影響を調べる以外に、その質問に対する静的な答えはありません。好ましくは営業時間内に。あなたがしていることをsysadminに伝えた後。彼/彼女はいくつかのアドバイスを持っているかもしれません。あなたはどのようなシステムが効率的にシステムとして多くのプロセスをサポートできるよう、あなたがParallel::ForkManager

+0

著作権で保護されている素材の無断複製を禁止します。 –

+1

[OK]を、Googleブックでまったく同じものにリンクします。 –

1

fork bombと呼ばれています。プロセステーブルが飽和してメモリとCPUが使い果たされると、システムがフリーズまたはクラッシュすることがあります。 Linuxシステムでは、ulimitコマンドに許可されるユーザープロセスの最大数が表示されます。あなたのシステムに合わせてこれを適切に設定することができます。フォークはプロセスを指数関数的に作成します。あなたは、同時にあまりにも多くのフォークプロセスを生成心配している場合は、あなたがそれらを絞ることができます。また

perl -e 'fork; fork; 1 while {}' 
0

産卵(フォーク)などのモジュールを使用することができます扱うことができるよりも多くのプロセスを起動いけないようにするに

関連する問題