Translated message

A translation of this page exists in English.

ActiveMQ: Broker へのメッセージ負荷が小さいにもかかわらず、CPU 使用率が高い

Solution Verified - Updated -

Environment

  • Broker: Fuse MB 5.5.0.fuse-00-43

  • クライアント: Fuse MR/Camel - 2.7.1.fuse-00-43、Fuse ESB/apache-servicemix 4.4.0-fuse-00-43

Issue

  • Broker からメッセージが送信されたり、または消費されたりしていないにもかかわらず、ActiveMQ が CPU を大量に使用しています。

Resolution

この場合、Broker であるコンシューマーは、Camel ルートで、camel-jms コンポーネントが cacheLevelName CACHE_AUTO にデフォルト値を使用していました。これはトランザクション処理された Camel ルートなので、CACHE_AUTO は実際には CACHE_NONE を使用しています。デフォルトでは、camel-jms コンシューマーはメッセージがあるかどうか毎秒キューをチェックします。CACHE_NONE を指定すると、ポーリングごとに JMS 接続、JMS セッション、JMS コンシューマーが生成および破棄されます。ルート上に多くのコンシューマーが同時に存在するため、Broker にかなりの負荷がかかっていました。

ルートは、XA トランザクションではなく、ActiveMQ Broker による JMS ローカルトランザクションのみを使用しているため、cacheLevelName を CACHE_CONSUMER に変更しても安全です。これにより、JMS リソースは再利用され、キューをチェックするたびに作成/破棄されることがなくなります。

Diagnostic Steps

1) Broker の DEBUG へのロギングを増やし、コンシューマーが作成され、すぐに破棄されるかどうかを確認します。

log4j.logger.org.apache.activemq=DEBUG

2) Jconsole または他の JMX クライアントを使用して、Brokers MBeans に接続します。"org.apache.activemq" -> "Your_Broker_name" -> "subscription" -> "non-durable" -> "queue" -> "your_queue_name" -> "your_connection_name" の順に移動してください。その特定のキューのその接続に関連するコンシューマーは、対象のレベルにリストアップされます。サブスクリプション ID がすぐに (1 秒以内に) 変更されるかどうか確認してください。これで、コンシューマーがキャッシュされていないことが判明する場合があります。

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments