6

私の特定のケースでは、少なくとも。ここで一般論を述べようとしているわけではありません。

Node.js で作成したこの Web クローラーがあります。代わりに Ruby を使用したいので、EventMachine で書き直しました。オリジナルは CoffeeScript にあったため、実際には驚くほど簡単でした。コードはほとんど同じですが、EventMachine では実際に例外をトラップして回復することができます (ファイバーを使用しているため)。

問題は、Node.js コードでは 20 秒未満で実行されるテストが、EventMachine では最大で 5 分以上かかることです。接続数を見ると、並行して実行されていないように見えます (何百ものキューに入れられた後、非常にゆっくりと下降します) が、ログはコード ポイント並行してヒットしていることを示しています。

コードがなければ、何が起こっているのかを正確に知ることはできませんが、何らかの根本的な違いがあるのであきらめるべきなのか、それとも本当に同じくらい速く実行できるべきなのか (a)多少の速度低下は問題ありません)、何が問題なのかを突き止める努力を続ける必要があります。

私は次のことをしましたが、実際には効果がないようでした:

puts "Running with ulimit: " + EM.set_descriptor_table_size(60000).to_s
EM.set_effective_user('nobody')
EM.kqueue

ああ、 EventMachineブロッキング コールがないことは確かです。すべての行を約 10 回くまなく調べて、ブロックしている可能性のあるものを探しました。私のネットワーク呼び出しはすべて EM::HttpRequest です。

4

1 に答える 1

13

問題は、Node.js コードでは 20 秒未満で実行されるテストが、EventMachine では最大で 5 分以上かかることです。接続数を見ると、並行して実行されていないように見えます (何百ものキューに入れられた後、非常にゆっくりと下降します) が、ログはコード ポイントが並行してヒットしていることを示しています。

それらが並行して実行されていない場合、それは非同期ではありません。だからあなたはブロックしています。

基本的に、標準の Ruby ライブラリで行ったブロッキング IO 呼び出しを特定し、それを削除して、EventMachine の非ブロッキング IO 呼び出しに置き換える必要があります。

あなたのコードにはブロッキング呼び出しがないかもしれませんが、独自のものではない、または からではないサードパーティのコードを使用していますEMか? 彼らはブロックするかもしれません。デバッグ出力/ログのような単純なものでもブロックされる可能性があります。

私のネットワーク呼び出しはすべて EM::HttpRequest です。

ファイル IO はどうですか? TCP はどうですか? ブロックできる他のものはどうですか。サードパーティのライブラリはどうですか。

ここで実際にいくつかのコードを確認する必要があります。コードのボトルネックまたはブロッキング呼び出しを特定するため。

node.js は、EM よりも 1 桁以上高速であってはなりません。

于 2011-05-25T17:32:02.173 に答える