2013-11-04 34 views
7

Netty 3からNetty 4にアップグレードすると、パフォーマンスが約45%低下します。Netty 4パフォーマンス低下

パフォーマンステストを実行しながらNetty 3とNetty 4のスレッドダンプを比較しました。 Netty 4サーバーは、書き込み操作に時間を費やしたようです。しかし、Netty 3ベースのクライアントでNetty 4ベースのクライアントを使用した場合、パフォーマンスの低下は約5%に過ぎないため、理由はサーバー側にあると推測しましたが、その理由を見つけることはできません。

誰かからアドバイスを受けることはできますか?

コードは次のURLで見ることができます。 https://code.google.com/p/nfs-rpc/source/browse/#svn%2Ftrunk%2Fnfs-rpc-netty4

+1

アプリケーションのプロファイリングを試しましたか?もしそうならボトルネックはどこにありますか? –

+0

どのスレッドプールを使用していますか?これは3-> 4移行の間に変更されていますか? –

答えて

3

Netty4は、多分あなたはチューニングより良いパフォーマンスを得るためにあなたのコードをすべきで、新しいスレッドモデルを導入しました。 ここにはNetty Wikiからのいくつかの点があり、さらにnetty4の変更点があります。

3.xに明確なスレッドモデルはありませんが、3.5ではその不一致を修正しようとしましたが、 4.0では、スレッド安全性についてあまり気にすることなく、ユーザーがChannelHandlerを書くのに役立つ厳密なスレッドモデルが定義されています。

ChannelHandlerに@Sharableというアノテーションが付けられていない限り、Nettyは決してChannelHandlerのメソッドを同時に呼び出すことはありません。これは、ハンドラ・メソッドのタイプ(インバウンド、アウトバウンド、またはライフ・サイクル・イベント・ハンドラ・メソッド)に関係なく行われます。

ユーザーは、インバウンドまたはアウトバウンドイベントハンドラメソッドをもう同期する必要はありません。

4.0では、@Sharableで注釈が付けられていない限り、ChannelHandlerを複数回追加することはできません。

Nettyによって行われた各ChannelHandlerメソッドの呼び出しの間には、常に先行する関係があります。

ユーザーは、ハンドラの状態を保持するためにvolatileフィールドを定義する必要はありません。 ユーザーは、ChannelPipelineにハンドラを追加するときにEventExecutorを指定できます。

指定された場合、ChannelHandlerのハンドラメソッドは常に、指定されたEventExecutorによって呼び出されます。

指定されていない場合、ハンドラメソッドは、関連付けられたChannelが登録されているEventLoopによって常に呼び出されます。

ハンドラまたはチャネルに割り当てられたEventExecutorおよびEventLoopは、常にシングルスレッドです。

ハンドラメソッドは常に同じスレッドによって呼び出されます。

マルチスレッドのEventExecutorまたはEventLoopが指定されている場合は、スレッドの1つが最初に選択され、選択されたスレッドが登録解除まで使用されます。

同じパイプライン内の2つのハンドラが異なるEventExecutorsで割り当てられている場合、それらは同時に呼び出されます。共有データが同じパイプラインのハンドラによってのみアクセスされたとしても、複数のハンドラが共有データにアクセスする場合、スレッドセーフティに注意する必要があります。 ChannelFutureに追加されたChannelFutureListenerは、将来の関連付けられたChannelに割り当てられたEventLoopスレッドによって常に呼び出されます。

関連する問題