2017-12-05 32 views
1

まず、GRPCクライアント/サーバ実装とwebsocket + protobufクライアント/サーバ実装のスループット/レイテンシのパフォーマンス比較を行った人はいますか?それとも少なくとも何かが類似している。GRPCサーバの応答待ち時間

この目標を達成するために、私はJAVA helloworld grpc client-serverのサンプルを試して、同様のwebsocketクライアントサーバーとの応答の待ち時間を比較しようとしています。現在、私はローカルマシン上のクライアントとサーバーの両方でこれを試しています。

websocket client-serverには、サーバ側で単純なwhileループがあります。 grpcサーバーの場合、私はそれが非同期実行モデルを使用していることに気づきます。私はそれが追加の処理オーバーヘッドの結果、各クライアント要求のための新しいスレッドを作成すると思われる。例えば、私が測定しているwebsocketの応答待ち時間は6〜7msのオーダーであり、grpcの例では約600〜700msの待ち時間が見られ、protobufオーバーヘッドが考慮されています。

grpcの同様の比較を行うには、grpcサーバーを同期して実行する方法がありますか?私は、スレッドの作成/ディスパッチと、非同期処理によって導入されたそのような内部オーバーヘッドのオーバーヘッドを排除できるようにしたい。

私のwebsocketクライアント/サーバの例ではないgrpcには、protobufのオーバーヘッドが含まれていることを理解しています。しかし、私はprotobuf処理によって導入されたオーバーヘッドを測定することによってそれを説明することができます。

また、grpcサーバーを同期して実行できない場合は、少なくともスレッドディスパッチ/非同期処理のオーバーヘッドを測定できますか?

私はJAVAには比較的新しいので、私の無知を赦してください。

答えて

1

Javaのベンチマークは間違いやすいです。 JITの複数のレベルが起動するには、数秒間のウォームアップを行う必要があります。また、ヒープサイズを段階的にオフにする時間が必要です。シンプルなワンショットベンチマークでは、クラスロードのために、最後に実行されるコードが(コードとは独立して)最も速いことが容易にわかります。 600 msはgRPCレイテンシの非常に大きな数値です。 TLSを使用して2台のマシン間でGoogle Compute Engineにaround 300 µs median latencyが表示されます。私はあなたにウォームアップがないと期待しているので、JavaがgRPCを読み込むのにかかる時間を数え、gRPCでインタープリタを使ってJavaを測定しています。

gRPCサーバの同期バージョンはありません。デフォルトでは別のスレッドで実行されていました。 grpc-javaはキャッシュされたスレッドプールを使用するので、最初のリクエストの後、gRPCはサービスを呼び出すためにスレッドを再利用できるはずです。

スレッド間のジャンプのコストは一般に低くなりますが、テールレイテンシが追加される可能性があります。一部のインプロセスNOOPベンチマークでは、余分なスレッドと4μsを使用せずに8μsでRPC完了を確認しています。あなたが本当に必要ならば、serverBuilder.directExecutor()を使ってスレッドホップを避けることができます。ほとんどのサービスでは、がそのオプションを使用してより遅くになり、サービス処理がI/Oを遅延させる可能性があるため、実際には劣悪なテール待ち時間があることに注意してください。

0

grpcと同様の比較を行うには、grpcサーバーを同期して実行する方法がありますか?私は、スレッドの作成/ディスパッチと、非同期処理によって導入されたそのような内部オーバーヘッドのオーバーヘッドを排除できるようにしたい。

同期クライアントを作成できます。一般に、非同期は高速です。 (Scalaでテストされています)取得したすべてのリソースをノンブロッキングの方法で単純に使用できます。サーバーが1秒あたりに処理できるクライアントの数から要求の数をテストします。クライアントごとに着信要求を制限して、サービスがクラッシュしないようにすることはできません。非同期はHTTP 2の方が優れています。HTTP 2は多重化を提供します。

ベンチマークについては、メトリクスをお勧めします。ログまたはhttpエンドポイントを介してメトリックを公開できます。

関連する問題