EventMachine を使用してリアルタイム アプリケーションを開発しています。2 つのクライアントA
とB
は、標準の TCP を介して、または em-websocket を使用した WebSocket を介して EventMachine サーバーに接続します。
データが EventMachine を通過するたびに、コードの実行に 95 ミリ秒のヒットがかかります。がサーバーと通信するときA
、95 ミリ秒の遅延があります。が にA
話しかけるとB
、190 ミリ秒の遅延があります。
多くのリクエストが立て続けに発生すると、シーケンスの最後のリクエストを除いて、遅延はなくなります。したがって、10 件の迅速なリクエストを送信すると、それぞれ約 5 ミリ秒後に 9 件の応答が返されますが、10 回目の応答には再び 95 ミリ秒かかります。
これはEventMachine.set_quantumと関係があると推測しました。ドキュメントから:
メソッド: EventMachine.set_quantum
上級ユーザー向け。この関数は、デフォルトのタイマー粒度を設定します。デフォルトでは、100 ミリ秒よりわずかに小さくなっています。より高いまたはより低い粒度を設定するには、この関数を呼び出します。この関数は、add_timer と add_periodic_timer の動作に影響します。ほとんどのアプリケーションは、この関数を呼び出す必要はありません。
極端な条件下でパフォーマンスが低下する可能性があるため、クォンタムを非常に低い値に設定しないでください。10 未満の値を使用しないことをお勧めします。
さて、それは 95ms がどこから来たのかを説明しています。案の定、遅延は を呼び出すことEventMachine.set_quantum
で変更されますが、ドキュメントに警告があるため、この値を微調整することには慎重です。
set_quantum
実際に何をしているのですか?量子変数の意味に関するドキュメントや説明が見つかりません。
これらの遅延を減らすにはどうすればよいですか? クォンタムをたとえば 10ms に減らした場合の潜在的な影響を理解したいと思います。
EventMachine は正しい選択でしょうか? 私は本質的にそれを美化されたTCP接続として使用しています。たぶん、プロセス間通信用の raw ソケットに固執し、EventMachine を使用しない WebSocket サーバー gem を見つける必要があります。