MINA を使用する Java アプリケーションがいくつかありますが、それらはすべて 20 個の MINA スレッドを使用しています。1 つのアプリケーションは約 10,000 の同時接続を処理します。通常はアイドル状態ですが、時々入力を受け取ります。20 は、そのアプリケーションの妥当なスレッド数である可能性がありますが、正確にプロファイリングしていません (この質問が得ているものです)。別のアプリケーションは、一度に約 15 の接続しか提供しませんが、IO 作業を開始するため非常にビジーであり、とにかく 20 の MINA スレッドがあり、明らかに多すぎます。
私にとって奇妙なことは、両方のアプリケーションが常に CPU 時間の約 30%、場合によっては 60% を、VisualVM でプロファイリングされた MINA の select() メソッドに費やしていることです。コール スタックは次のようになります。
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:228)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:81)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
- locked <40ca5d54> (a sun.nio.ch.Util$2)
- locked <24649fe8> (a java.util.Collections$UnmodifiableSet)
- locked <3fae9662> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
at org.apache.mina.transport.socket.nio.NioProcessor.select(NioProcessor.java:72)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1093)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
忙しい世論調査に基づいているようですが、これは私には本当に間違っているように聞こえます。
そんなに高い数値を見たとき、心配する必要がありますか? これは何が原因ですか?それは私が最適化する必要があるものですか、それとも睡眠やアイドルルーチンに似ていますか? それがスリープルーチンのようなものである場合、他の CPU 作業よりも優先度が低くなるように何らかの形でスケジュールされていますか?
更新: このスレッドは同じ問題のようです。私はそのアドバイスに従い、現在 Java 1.7.0_45 を実行していますが、10,000select
接続のアプリケーションで CPU 時間の 90% もの高さをまだ取っています。
MINA 2.0.4 を使用しているため、この関連するバグは修正されています。