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