2010-12-12 10 views
0

私はいくつかのスクリプトのインスタンスを実行していますが、すべて正常に動作します。 私がロードする各端末はCPUを高くします。Perlスクリプトhogging CPU

私は12のインスタンスを実行し、デュアルコアCPUの99%を抑制しています。 私はRAM 8GBのDDR3を完全に積み重ねました。 プロジェクト中のある時点で、私はmysqlを使用しましたが、重いボトルネックがあり、いくつかのランダムな切断エラーがありました(グーグルが私にNICと言えると言いました)。

とにかく...ディスクへの書き込みはシェルからずっと速くなりました。 使用されるモジュールはWWWです:Mechanize

ただし、インスタンスごとに、プロファイルはひどいものではありません。 24%までバウンスします。しかし、私は8または9のターミナルウィンドウを実行して100%の負荷まで実行に限界に達しています。おそらく、帯域幅の結果であり、ちょうどダウンロード時間です。何キロバイト後にダウンロードを停止するとしますか?

おかげで、 ピーター

+1

これらのスクリプトは何をしていますか? 「RAMとCPUをさらに活用する」を参照するとき、あなたは何を話していますか?彼らは交換可能な資源ではありません。 – fennec

+3

あなたは非常に混乱しているようです。あなたがしようとしていることをよく知らない人の視点に立って、その人があなたの目標と制約の両方を理解できるように質問をしてください。さらに、なぜあなたのCPUをアイドル状態にしたいのですか? –

答えて

0

は、残念ながら、私はそのようにperlインタプリタの挙動に影響を与える方法があるとは思いません。あなたのボックスにあるすべてのperlスクリプトのCPUリミットを設定することができますが、私が知る限りperlで行う方法はありません。インタープリタはすべてのメモリ割り当てなどを独自に管理しています。

あなたは、このリンクをチェックアウトすることができます:それは間違いなく19回のインタプリタを実行し、より効率的になるようHow to limit CPU usage in perl

また、あなたは、perlのスレッドに見てみたいことがあります。

+0

返事をありがとう..うーん。モジュールについてはどうでしょうか。 WWW:Mechanize ..これをうまく利用するための考え? Curl、LWPのような代替案が良いでしょうか? –

+3

'Devel :: NYTProf'の下でスクリプトを実行し、あなたのスクリプトが実際にCPU時間を費やしている場所を見ることができます。プロファイリング! – fennec

+1

WWW :: Mechanizeモジュールは、Web処理に最適なモジュールであるとみなされます。代わりに、MechanizeはLWPのサブクラスであるため、Mechanizeはデータの処理をほとんど改善しません。より多くのサポートが必要な場合は、問題の実際のスクリプトを投稿してください。 @fennec:良い点!+1 –

1

しかし、私はそれは、帯域幅の結果 で、時間だけをダウンロード..ほとんどのランニング 8つのまたは9ターミナルウィンドウで 100%負荷に実行するには限界に達した。..

ウム...帯域幅の制約/ダウンロード時間のために壁に衝突した場合、プロセスはI/O(プロセス状態Dtop/ps)でブロックされ、事実上スリープ状態になり、 I/O要求が完了するまで

あなたの現在の問題は、あなたのコードが何をしているかについての詳細な説明なしでは理想的ではありませんが、アルゴリズムの一般的な説明で十分でしょう。

8または9個のプロセスを実行している場合、1つのインスタンスが平均11-12%のCPU使用率を平均した場合、CPUを100%でペグすることが保証されます。あなたはプロセスあたりの平均CPU消費量について何も言っていませんが、定期的に最大24%までバウンスすると、その半分以上の平均があることに驚くことはありません。

+0

Daveは入力してくれてありがとう(私もあなたのウェブサイトを楽しんだ)。私は経験不足が鍵であると確信しているので、これを一般的に保ちましょう。明らかに、4%の確率で100%スパイクした24%で多くの端末を実行すると、単純な計算になります。私が心に留めているいくつかのアイデアがありますが、悲しいかなら、時間の時間です。私は素晴らしいループのforの "last"という素晴らしいコマンドを見つけましたが、参考にしました。 –

+0

興味のある方には、私の問題の大きな解決策を見つけました(一部)。 mysqlサーバでRAND()を使用すると、毎回30万レコード以上のインデックスを作成する必要がありました。私はRAND()がこのスケールでは非効率的であることを知っていましたが、代替案を見つけることができませんでした。(Perlでクライアント側を悩ましていた先のリクエストを生成しようとしました)Alas .. Until ... " )> .9 order by rand()limit 1; "このクエリでは、クエリから90%のオーバーヘッドがかかりました。私はまだ持っている質問は、なぜですか? :) –

+0

@Peter:ああ、そうですね。はい。クエリで 'RAND'を使用すると、データベースは返されたとしても、テーブルのすべての行に対してランダムな値を生成する必要があります最後に1行さらに悪いことに、 'ORDER BY RAND'に行く場合、索引付けされていない値で行をソートする必要があります。これは比較的高価な操作です。 'WHERE RAND> .9'を追加することで、現在330kの乱数が生成されていますが、索引付けされていない30,000の値をソートするだけです。なぜなら、最初の' RAND'が返す90% 「ORDER BY」が処理される。 –

関連する問題