0

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)
4

2 に答える 2

2

IMO MessageListener を使用する必要があります..または、10秒など、より長い時間ブロックするだけです...

... 10 ミリ秒の繰り返しは、システムにとって大きなバーストです。特に、クライアントは毎回サーバーにコールバックを送信します。

メッセージ システムに作業を任せます。つまり、メッセージが届いたら電話をかけます。何もせずに 10 ミリ秒ごとにシステムをポーリングしている場合、他に何も期待できません。

あなた自身が指摘したように、これがあなたの問題の原因です:

consumer.receive(10);

この receive(10) でサーバーを叩いている各消費者は、消費者ごとに毎秒100メッセージを送信するようにサーバーを作成しています...私は空です。

receive(10) は、転送中のメッセージがないことを保証するためにラウンドトリップを行います。したがって、空のメッセージでサーバーを叩いています。

アプリケーションは、強制しているパラメーターに基づいて適切に実行されるとは想定されていません。そして、 null を返す前に receive(10) が空であることを保証するメッセージソリューションに対して。

于 2013-02-05T16:02:35.543 に答える
1

クレベールの答えは飲み込むのが少し難しいですが、それは最終的には有効なケースです。ワーカーとして機能し、JMSプロバイダーがそれらを呼び出せるようにする複数のメッセージリスナーを簡単に作成できます。宛先が何らかのキューであると仮定すると、メッセージリスナーは、複数のスレッドが処理を処理できるように、かなり分散された負荷で呼び出されます。メッセージリスナーを作成すると、JMSプロバイダーはメッセージが到着したときにそれらを呼び出すことができ、クライアントがメッセージを消費するのを待つ必要はありません。

receiveメソッドを呼び出すたびに、Clebertが説明しているように動作します(彼はHornetQのリーダーであることを知っておく必要があります)。

Netty HornetQ 2.2.14のバージョンはわかりませんが、非常によく似たものに関連するいくつかの問題がgithubのリポジトリで見つかりました。おそらく、アプリケーションでNettyのバージョンを更新して、それが役立つかどうかを確認できますか?

https://github.com/netty/netty/issues/592

https://github.com/netty/netty/issues/582

于 2013-03-02T22:20:39.917 に答える