CentOS 6.3 で HornetQ 2.2.14 を使用しています。アプリサーバーで CPU 使用率が高いという問題が発生しており、プロファイラーを使用して HornetQ コンシューマーに絞り込みました。
具体的には、約 150 のコンシューマーを持つ空のキューでこのメソッドを立て続けに呼び出しています。
// Called about every 10ms per consumer.
javax.jms.MessageConsumer.receive(10);
これにより、約 2 つの NIO ワーカー スレッドが Netty にさかのぼり、アイドル状態の Tomcat インスタンスで 2 つの CPU コアの約 50% を消費します。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21939 tomcat 20 0 9061m 1.6g 16m R 55.4 21.2 1:06.88 java
21777 tomcat 20 0 9061m 1.6g 16m S 47.6 21.2 1:29.40 java
21777 tomcat 20 0 9061m 1.6g 16m S 7.3 21.2 1:33.41 java
21763 tomcat 20 0 9061m 1.6g 16m S 6.6 21.2 1:28.84 java
21682 tomcat 20 0 9061m 1.6g 16m S 4.3 21.2 0:26.70 java
問題は、Windows でまったく同じコードと Tomcat 構成を使用すると、CPU コアがアイドル状態になることです。これにより、これは Linux/Netty/HornetQ の問題であると思われます。他の誰かがこれを前に見たことがありますか?もしそうなら、どうすれば消えますか?
Linux バージョン: CentOS 6.3 x64 Linux カーネル バージョン: Linux バージョン 2.6.32-279.19.1.el6.x86_64
以下は、同じ結果でテストした 2 つの Java バージョンです。
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
Java(TM) SE Runtime Environment (build 1.6.0_38-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.13-b02, mixed mode)