2012-01-09 17 views
1

CODE-1接続のパフォーマンスが低下しますか?

new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(),WORKER_SIZE) 

CODE-2

OrderedMemoryAwareThreadPoolExecutor executor = new OrderedMemoryAwareThreadPoolExecutor(48, 0, 0, 1, TimeUnit.SECONDS); 
pipeline.addLast("executor", new ExecutionHandler(executor)); 

IOワーカースレッドプールのサイズ(デフォルトはCPUの2 *数である)の目的が何であるか、CODE-1から設定することができた場合executor(スレッドプール)をCODE-2のパイプラインに追加しますか?

IO操作はワーカースレッドから実行されます。つまり、接続が遅いネットワークや悪いネットワークのクライアントは、データが完全に送信されるまでIOワーカースレッドをビジー状態に保ちますか?もしそうなら、WORKER_SIZEを増やすことで待ち時間を防ぐことができますか?

+0

どのオペレーティングシステムでですか? –

+0

サーバはcentos – WorM

答えて

1

低速回線接続をブロックしないように網状に設定されている - あなたは、ノンブロッキングアーキテクチャ(NIO)を使用しているので、

低速接続では、パフォーマンスに影響を与えません。 NIOでは通常(アップデートノートを確認してください)。

ネッティーサーバ内部スレッドに関するいくつかのポイント

  • デフォルトであり、サーバポートごとに1つだけのボススレッドになり、そしてそれ ワーカー スレッドへの接続の接続やハンドオーバを受け入れます。

  • 正確には、WORKER_SIZEはサーバーが持つことができるNioWorker ランナムの最大数です。たとえば、サーバに の接続が1つしかない場合は、ワーカースレッドが1つあります。接続数が増えており、次のワーカー(アクティブな接続> WORKER_SIZE)に割り当てることができない場合、接続はラウンドロビン方式でワーカーに割り当てられます。

IOワーカースレッドプールのサイズ(デフォルトはCPUの2 *カウントです)CODE-2でパイプラインに実行者(スレッドプール)を添加する目的が何であるか、CODE-1から設定することができた場合?

アップストリームタスクがブロックしている場合は、実行ハンドラを使用して別のスレッドプールで実行する必要があります。それ以外の場合、Nioの読み込み/書き込みは時間通りに動作しません(レイテンシ?)。私は実行ハンドラを持っていると、大きな値をWORKER_SIZEに設定するよりも待ち時間を短縮するのに役立つと思います。

IO操作はワーカースレッドから実行されます。つまり、接続が遅いネットワークや悪いネットワークのクライアントは、データが完全に送信されるまでIOワーカースレッドをビジー状態に保ちますか?もしそうなら、WORKER_SIZEを増やすことで待ち時間を防ぐことができますか?

一般> WORKER_SIZEを高め、話す= NIOが非ブロッキングとCPU集約型タスクのCPU intensive.For私は間違っていないよ場合は、そのCPUのスレッド* 2の数である、ので、CPU * 2の数は解決しません主に選択されます。

更新:

NioWorkerは、タイムアウトとブロッキング呼び出しをOP_READ、selector.selectを受信すると、接続のほとんどが遅い場合、パフォーマンスは減らすことができるselector.select(500ミリ秒)でループを実行します?。 org.jboss.netty.channel.socket.nio.SelectorUtil.javaとtestでタイムアウトを減らすことができます。

+0

jestan、私は混乱しています。ボススレッドは要求をIOワーカースレッドに渡します。ワーカースレッドは実行ハンドラを起動します。実行プールがハンドラ用に設定されている場合、リクエストは別のスレッドで処理され、ワー​​カースレッドは解放されます。私は正しい? – WorM

0

CODE-1で追加するスレッドプールは、ボススレッドとワーカースレッド用です。ボススレッドは接続を受け入れ、処理するワーカースレッドに渡します。

CODE-2に追加するエグゼキュータは、ワーカースレッドによって読み取られたメッセージを処理するためのものです。 (それが望んでいた場合、それは可能性)ネッティースレッドには影響を与えません

+0

です。私はボススレッドがIOワーカースレッド(サイズ:CODE-1のWORKER_SIZEを持つプールから選択)にリクエストを渡すと言うことができます。 IOワーカースレッドは、(CODE-2で設定されている)処理対象の別のスレッドに読み取りメッセージを渡します。 – WorM

関連する問題