私はNettyアプリケーションを書いています。アプリケーションは 64 ビット 8 コア Linux ボックスで実行されています
Netty アプリケーションは、リクエストを受け入れる単純なルーター (受信パイプライン) で、リクエストからいくつかのメタデータを読み取り、データをリモート サービス (送信パイプライン) に転送します。
このリモート サービスは、発信パイプラインに 1 つ以上の応答を返します。Netty アプリケーションは、応答を元のクライアント (着信パイプライン) に送り返します。
何千ものクライアントが存在します。何千ものリモート サービスが存在します。
小規模なテスト (10 クライアント、10 リモート サービス) を行っていますが、99.9 パーセンタイルで期待している 10 ミリ秒未満のパフォーマンスが見られません。クライアント側とサーバー側の両方からレイテンシを測定しています。
SPDY に似た完全な非同期プロトコルを使用しています。FrameDecoder で最初のバイトを処理するときの時間をキャプチャします (私は単に System.nanoTime() を使用します)。channel.write() を呼び出す直前にタイマーを停止します。入力パイプラインから出力パイプラインまで、およびその逆のミリ秒未満の時間 (99.9 パーセンタイル) を測定しています。
また、FrameDecoder の最初のバイトから、(上記の) message.write() で ChannelFutureListener コールバックが呼び出されるまでの時間も測定しました。時間は数十ミリ秒 (99.9 パーセンタイル) でしたが、これが有用なデータであると確信するのに苦労しました。
私の最初の考えは、遅いクライアントがいくつかあるということでした。channel.isWritable() を見て、これが false を返したときにログに記録しました。このメソッドは、通常の状態では false を返しませんでした
いくつかの事実:
- NIOファクトリーを使用しています。ワーカーのサイズをカスタマイズしていません
- Nagel を無効にしました (tcpNoDelay=true)
- キープアライブを有効にしました (keepAlive=true)
- CPU は 90% 以上の時間アイドル状態です
- ネットワークがアイドル状態です
- GC (CMS) が 100 秒ごとに、非常に短い時間呼び出されています。
Netty アプリケーションが思ったほど速く実行されない理由を特定するために従うことができるデバッグ手法はありますか?
channel.write() がメッセージをキューに追加するように感じますが、私たち (Netty を使用するアプリケーション開発者) はこのキューに透過的ではありません。キューが Netty キューなのか、OS キューなのか、ネットワーク カード キューなのか、それとも何なのかわかりません。とにかく、既存のアプリケーションの例を確認していますが、フォローしているアンチパターンは見当たりません
ヘルプ/洞察をありがとう