2011-12-21 22 views
0

私は自分のシステムに3つのThreadPoolExecutorsを持っています。Nettyスレッドがブロックされています

Nettyのマスタプロセスの1つ、もう1つはNettyのワーカープロセス用、もう1つはアドホック処理(メールサーバへの要求送信)のためのものです。

ExecutorService bossExecutors = Executors.newFixedThreadPool(1, new 
ServerThreadFactory("netty-boss")); ExecutorService workerExecutors = 
Executors.newFixedThreadPool(10, new 
ServerThreadFactory("netty-worker")); 
      ChannelFactory factory = new NioServerSocketChannelFactory(
       bossExecutors, 
       workerExecutors, 
       Runtime.getRuntime().availableProcessors()); 

ExecutorService mailExecutor = Executors.newFixedThreadPool(40); 

これは、mailExecutorがメールサーバーに要求を開始するまで完全に正常に動作します。一般的に、メールサーバへの5000回以上のリクエストが完了すると、そのバッチはmailExecutorを使用してリクエストされ、ネットスレッドはブロックされます。

私は明確なスレッドプールを割り当てているので、なぜnettyスレッドがブロックされているように見えるのか分かりません。その間、Nettyは単一の要求を処理することさえできません。

なぜそれが起こっているのか、私が間違っているのか?

ありがとうございました。

答えて

0

スケジューリングの問題のようです。あなたは、Netty作業を処理するためのスレッドの利用可能なプロセッサー数に対する負荷が40以下のスレッドを持っています(ファクトリーを作成する際のavailableProcessors()カウントは何ですか?)。

Nettyスレッドがあまりにも少なくて、メール作業を処理するスレッド40個に比べて実行されることは決してないので、枯渇している可能性があります。

何らかの理由で、ワーカースレッドがメールスレッドの終了時にブロックされている可能性があります。おそらく、同期対象の共有オブジェクトが原因です(キャッシュされているメールのリストまたはメールのリストスレッドに書き込む必要があり、送信中にメールスレッドがロックされていますか?)。

1

スレッドダンプを提供できますか?

jstack <pid> 

また、worker/possスレッドプールには固定スレッドプールを使用しないでください。キャッシュされたものを使用すると、決して飢餓に陥ることはありません。コンストラクタで3つの引数を指定してワーカー数を指定する必要があります。

+0

私は、worker count = Runtime.getRuntime()。availableProcessors()を使用して固定スレッドプールをCached ThreadPoolに変更しました。 しかし、それはまだ起こっているようです。 ここにスレッドダンプがあります:http://dl.dropbox.com/u/360993/jstack.txt ありがとうございました。 –

+0

問題は、メールサーバーへの送信がブロック操作であることです。したがって、送信を行うハンドラの前にExecutionHandlerを追加する必要があります。さもなければ、あなたはネットのIOスレッドをブロックします。 –

関連する問題