0

EventMachine を使用してリアルタイム アプリケーションを開発しています。2 つのクライアントABは、標準の 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 を見つける必要があります。

4

1 に答える 1