select()がプログラムでCPU時間を多く消費するのはなぜですか?

djechlin:

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を実行selectしていますが、接続が10kのアプリケーションでは、CPU時間の90%を占めることがわかります。

私たちはMINA 2.0.4を使用しています。つまり、この関連するバグは修正されています。

デニスバジェノフ:

残念ながら、これは数値の誤った解釈です。

私はこの状況に何度も直面しました(そして、stackoverflowについて質問します)。

主な理由は、VisualVMが正しいCPU時間を表示しないためです。RUNNING状態のスレッド時間の割合を示します。しかし、ドキュメントからThread.State

実行可能なスレッドのスレッド状態。実行可能状態のスレッドはJava仮想マシンで実行されていますが、プロセッサなどのオペレーティングシステムからの他のリソースを待機している可能性があります。

これはまさに起こっていることです。実際、OS epoll_wait()呼び出し内でスレッドがブロックされています。Linuxボックスでは、それが事実であることを確認できるいくつかの方法があります。

straceのスレッド

$ strace -tttT -f -p [thread-id]

スレッドIDはjstack出力から取得できます:

$ jstack [java-pid]
[...]
"Netty Builtin Server 1" #17 prio=5 os_prio=31 tid=0x00000001013dd800 nid=0xe12f runnable [0x0000700001fe4000]
  java.lang.Thread.State: RUNNABLE
  at sun.nio.ch.KQueueArrayWrapper.kevent0(Native Method)
  at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:198)
[...]

この場合、スレッドIDは0xe12f(10進数に変換する必要があります)です。ほとんどの場合、スレッドがepoll_wait()呼び出さます。

pidstatingスレッド

$ pidstat -tu -p [java-pid] | grep [thread pid]

このスレッドにより、システムとユーザーのCPU時間が短くなることがわかります。つまり、CPUを消費しません。

スレッド状態のポーリング ps

$ ps -eL -o pid,tid,state | grep [thread-id]

ほとんどの場合、スレッド(実行可能)ではなく、状態SまたはSl(割り込みR可能なスリープ)で表示されます。

最後に、サービスに運用上の問題がない場合は、そのことについて心配する必要はありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

この関数が時間外に多くのメモリを消費するのはなぜですか

分類Dev

このJavaプログラムがメモリを大量に消費するのはなぜですか?

分類Dev

空のJavaプログラムがメモリを消費するのはなぜですか?

分類Dev

なぜRegExp.testはIEで多くの時間を消費するのですか?

分類Dev

プログラムがシステムCPU時間を使用しているのはなぜですか?

分類Dev

STRAIGHT_JOINがより多くのCPUを消費するのはなぜですか?

分類Dev

プログラムが時々動かなくなるのはなぜですか?

分類Dev

ダミーループがカーネル時間を消費するのはなぜですか?

分類Dev

pygameプログラムの実行時間が長くなるほど、プログラムが徐々に遅くなるのはなぜですか?

分類Dev

「システムアイドルプロセス」がCPUを熱くし、電力を消費しないのはなぜですか?

分類Dev

実行に時間がかかるプログラムを実行すると、matlabの実行がどんどん遅くなるのはなぜですか?

分類Dev

IEがCPUを大量に消費するのはなぜですか?

分類Dev

ノンブロッキングTCPソケットが:: write()呼び出しに多くの時間を費やすのはなぜですか?

分類Dev

TcpClientが非常に遅く、CPUを大量に消費するのはなぜですか?

分類Dev

MySQLがこれほど多くのメモリを消費するのはなぜですか?

分類Dev

Kafkaの消費者が消費を開始するのに長い時間がかかるのはなぜですか?

分類Dev

rtkit-daemonがCPUを100%消費しているのはなぜですか?

分類Dev

rtkit-daemonがCPUを100%消費しているのはなぜですか?

分類Dev

なぜ「誰も」は常に私の記憶を消費する新しい「検索」プログラムを開始するのですか?

分類Dev

空のプログラムを実行するのになぜ多くの命令が必要なのですか?

分類Dev

列がまばらなパンダのデータフレームがより多くのメモリを消費するのはなぜですか?

分類Dev

文字列の代わりに配列を使用すると、メモリ消費と実行時間が少なくなるのはなぜですか?

分類Dev

並列プログラムのウォール時間(経過時間)がCPU時間よりも短いのはなぜですか?

分類Dev

プログラムを使用すると、形状が消えるのはなぜですか?

分類Dev

IDLE 3.4がこのプログラムにそれほど時間がかかるのはなぜですか?

分類Dev

iOS CPUプロファイル:このスレッドが99.9%のCPUを消費しているのはなぜですか?

分類Dev

プログラムの実行に時間がかかるのはなぜですか?

分類Dev

単純なC ++プログラムが非常に多くの分岐コマンドを生成するのはなぜですか?Linuxでperfを使用する

分類Dev

消費者グループのリバランス時間を決定する要因は何ですか?

Related 関連記事

  1. 1

    この関数が時間外に多くのメモリを消費するのはなぜですか

  2. 2

    このJavaプログラムがメモリを大量に消費するのはなぜですか?

  3. 3

    空のJavaプログラムがメモリを消費するのはなぜですか?

  4. 4

    なぜRegExp.testはIEで多くの時間を消費するのですか?

  5. 5

    プログラムがシステムCPU時間を使用しているのはなぜですか?

  6. 6

    STRAIGHT_JOINがより多くのCPUを消費するのはなぜですか?

  7. 7

    プログラムが時々動かなくなるのはなぜですか?

  8. 8

    ダミーループがカーネル時間を消費するのはなぜですか?

  9. 9

    pygameプログラムの実行時間が長くなるほど、プログラムが徐々に遅くなるのはなぜですか?

  10. 10

    「システムアイドルプロセス」がCPUを熱くし、電力を消費しないのはなぜですか?

  11. 11

    実行に時間がかかるプログラムを実行すると、matlabの実行がどんどん遅くなるのはなぜですか?

  12. 12

    IEがCPUを大量に消費するのはなぜですか?

  13. 13

    ノンブロッキングTCPソケットが:: write()呼び出しに多くの時間を費やすのはなぜですか?

  14. 14

    TcpClientが非常に遅く、CPUを大量に消費するのはなぜですか?

  15. 15

    MySQLがこれほど多くのメモリを消費するのはなぜですか?

  16. 16

    Kafkaの消費者が消費を開始するのに長い時間がかかるのはなぜですか?

  17. 17

    rtkit-daemonがCPUを100%消費しているのはなぜですか?

  18. 18

    rtkit-daemonがCPUを100%消費しているのはなぜですか?

  19. 19

    なぜ「誰も」は常に私の記憶を消費する新しい「検索」プログラムを開始するのですか?

  20. 20

    空のプログラムを実行するのになぜ多くの命令が必要なのですか?

  21. 21

    列がまばらなパンダのデータフレームがより多くのメモリを消費するのはなぜですか?

  22. 22

    文字列の代わりに配列を使用すると、メモリ消費と実行時間が少なくなるのはなぜですか?

  23. 23

    並列プログラムのウォール時間(経過時間)がCPU時間よりも短いのはなぜですか?

  24. 24

    プログラムを使用すると、形状が消えるのはなぜですか?

  25. 25

    IDLE 3.4がこのプログラムにそれほど時間がかかるのはなぜですか?

  26. 26

    iOS CPUプロファイル:このスレッドが99.9%のCPUを消費しているのはなぜですか?

  27. 27

    プログラムの実行に時間がかかるのはなぜですか?

  28. 28

    単純なC ++プログラムが非常に多くの分岐コマンドを生成するのはなぜですか?Linuxでperfを使用する

  29. 29

    消費者グループのリバランス時間を決定する要因は何ですか?

ホットタグ

アーカイブ