ActiveMQ問題分析和解決
1)KahaDb和AMQ Message Store兩種持久方式如何選擇?
官方:
From 5.3 onwards - we recommend you use KahaDB - which offers improved scalability and recoverability over the AMQ Message Store.
The AMQ Message Store which although faster than KahaDB - does not scales as well as KahaDB and recovery times take longer.
非官方:
kaha檔案系統實際上上是一個檔案索引系統,有兩部分組成,一個是資料檔案系統,由一個個獨立的檔案組成,預設檔案大小是32M大(可配置),另外一個是索引檔案系統,記錄訊息在資料檔案中的位置資訊以及資料檔案中的空閒塊資訊。資料檔案是儲存到硬碟上的,索引檔案是快取在記憶體中的。所以這個儲存系統對大訊息儲存有利,象我們的memberId之類的文字訊息,實際上是浪費,索引比訊息還大,哈。
我方分析:
推薦: Amq持久方式
理由:雖然官方推薦使用KahaDB持久方式,但其提到的優勢:可伸縮性和恢復性較好,對於我們實際的應用意義不大。從我們自己的使用經驗來看,KahaDB持久方式,Data檔案是一個大檔案(感覺檔案過大後,造成佇列服務癱死的可能性會增大),從官網的相關配置(附錄1)也找不到哪裡可以設定資料的檔案的最大Size。)而Amq持久方式可以設定Data檔案最大Size,這樣可以保證即時訊息積壓很多,Data檔案也不至於過大。
2)錯誤:Channel was inactive for too long
解決方法:
在建立連線的Uri中加入: wireFormat.maxInactivityDuration=0
參考資源:
http://jinguo.iteye.com/blog/243153
You can do the following to fix the issues:
1) Append max inactivity duration to your Uri in the format below: wireFormat.maxInactivityDuration=0
2) Use the same Uri at the client side as well as at the server side
Regards,
如果不這樣設定,對應的錯誤會出現:
2008-05-07 09:22:56,343 [org.apache.activemq.ActiveMQConnection]-[WARN] Async exception with no exception listener: org.apache.activemq.transport.InactivityIOException: Channel was inactive for too long: localhost/127.0.0.1:61616
org.apache.activemq.transport.InactivityIOException: Channel was inactive for too long: localhost/127.0.0.1:61616
ActiveMQ的tcp url:tcp://localhost:61616後面要加入?wireFormat.maxInactivityDuration=0 這樣的引數,否則當一段時間沒有訊息傳送時會丟擲 "Channel was inactive for too long"異常
3)錯誤:Wire format negotiation timeout: peer did not send his wire format.
解決方法:
1)關閉ActiveMqLog4j
開啟:conf/log4j.properties
將:log4j.rootLogger=INFO, console, logfile
修改為:log4j.rootLogger=OFF
2)在建立連線的Uri中加入: maxInactivityDurationInitalDelay=30000
例如北京的測試環境連線Uri:
tcp://192.168.199.80:61616?wireFormat.maxInactivityDuration=0&maxInactivityDurationInitalDelay=30000&connection.AsyncSend=true
參考資源:
If you get exception like this,it can mean one of three things:
1. You're connecting to the port not used by ActiveMQ TCP transport
Make sure to check that you're connecting to the appropriate host:port
2. You're using log4j JMS appender and doesn't filter out ActiveMQ log messages
Be sure to read How do I use log4j JMS appender with ActiveMQ and more importantly to never send ActiveMQ log messages to JMS appender
3. Your broker is probably under heavy load (or network connection is unreliable), so connection setup cannot be completed in a reasonable time
If you experience sporadic exceptions like this, the best solution is to use failover transport, so that your clients can try connecting again if the first attempt fails. If you're getting these kind of exceptions more frequently you can also try extending wire format negotiation period (default 10 sec). You can do that by using wireFormat.maxInactivityDurationInitalDelay property on the connection URL in your client.
For example
tcp://localhost:61616?wireFormat.maxInactivityDurationInitalDelay=30000
will use 30 sec timeout.(貌似有問題!!!)
4)錯誤:Out of memory
解決方法:
1) 設定Java最大記憶體限制為合適大小:
Bin/activemq.bat 中ACTIVEMQ_OPTS=-Xmx512M(預設是512)
2)Activemq.xml配置節:systemUsage/ systemUsage配置大小合適,並且特別注意:大於所有durable desitination設定的memoryUsage之和。
備註:
1)尖括號:“>”代表萬用字元
2)ACTIVEMQ_OPTS的配置〉=memoryUsage中配置〉=所有durable desitination設定之和
3)SystemUsage配置設定了一些系統記憶體和硬碟容量,當系統消耗超過這些容量設定時,amq會“slow down producer”,還是很重要的。
參考資料:
http://m.oschina.net/blog/26216
參考--
對於MQ的內容實用是可管理和可配置的。首先需要判斷的是MQ的哪部分系統因記憶體不足而導致洩漏,是JVM,broker還是消費者、生產者?
一、記憶體管理
JVM記憶體管理:
1. 用bin/activemq命令在獨立JVM中執行broker。用-Xmx和-Xss命令即可(activemq.bat檔案中修改ACTIVEMQ_OPTS選項引數即可);
2. 預設情況下,MQ用512M的JVM;
broker記憶體管理:
1. broker使用的記憶體並不是由JVM的記憶體決定的。雖然受到JVM的限制,但broker確實獨立管理器記憶體;
2. systemUsage和destination的記憶體限制與broker記憶體息息相關;
3. MQ中記憶體的關係是:JVM->Broker->broker features;
4. 所有destination的記憶體總量不能超過broker的總記憶體;
消費者:
1. 由於訊息大小可以配置,prefetch limit往往是導致記憶體溢位的主要原因;
2. 減少prefetch limit的大小,會減少消費者記憶體中儲存的訊息數量;
生產者:
1. 除非訊息數量超過了broker資源的限制,否則生產者不會導致記憶體溢位;
2. 當記憶體溢位後,生產者會收到broker的阻塞資訊提示;
二、其他
將訊息緩衝之硬碟:
1. 只有當訊息在記憶體中儲存時,才允許訊息的快速匹配與分發,而當消費者很慢或者離開時,記憶體可能會耗盡;
2. 當destination到達它的記憶體臨界值時,broker會用訊息遊標來快取非持久化的訊息到硬碟。
3. 臨界值在broker中透過memoryUsage和systemUsage兩個屬性配置,請參考activemq.xml;
4. 對於緩慢的消費者,當尚未耗盡記憶體或者轉變為生產者併發控制模式前,這個特性允許生產者繼續傳送訊息到broker;
5. 當有多個destination的時候,預設的記憶體臨界值可能被打破,而這種情況將訊息快取到硬碟就顯得很有意義;
6. precentUsage配置:使用百分比來控制記憶體使用情況;
多個執行緒:
1. 預設情況下,MQ每個destination都對應唯一的執行緒;
2. -Dorg.apache.activema.UseDedicatedTaskRunner=false(activemq.bat檔案中修改ACTIVEMQ_OPTS選項引數即可),用執行緒池來限制執行緒的數量,從而減少記憶體消耗;
大資料傳輸:
1. destination policies--maxPageSize:控制進入記憶體中的訊息數量;lazyDispatch:增加控制使用當前消費者列表的預取值;
2. 使用blogMessage或者streamsMessage型別來進行大量檔案的傳輸;
洩漏JMS資源:
1. 當session或者producer或者consumer大量存在而沒有關閉的時候;
2. 使用PooledConnectionFactory;
5)採用failover方式連線導致卡死
解決方法:
不採用failover連線
分析:
採用failover方式連線,如果所要連線的伺服器或者Activemq服務宕了,那麼程式會一直處於等待狀態,不超時,不報錯。
二)附錄
1)KahaDB持久配置
property name |
default value |
Comments |
directory |
activemq-data |
the path to the directory to use to store the message store data and log files |
indexWriteBatchSize |
1000 |
number of indexes written in a batch |
indexCacheSize |
10000 |
number of index pages cached in memory |
enableIndexWriteAsync |
false |
if set, will asynchronously write indexes |
journalMaxFileLength |
32mb |
a hint to set the maximum size of the message data logs |
enableJournalDiskSyncs |
true |
ensure every non transactional journal write is followed by a disk sync (JMS durability requirement) |
cleanupInterval |
30000 |
time (ms) before checking for a discarding/moving message data logs that are no longer used |
checkpointInterval |
5000 |
time (ms) before checkpointing the journal |
ignoreMissingJournalfiles |
false |
If enabled, will ignore a missing message log file |
checkForCorruptJournalFiles |
false |
If enabled, will check for corrupted Journal files on startup and try and recover them |
checksumJournalFiles |
false |
create a checksum for a journal file - to enable checking for corrupted journals |
Available since version 5.4: |
||
archiveDataLogs |
false |
If enabled, will move a message data log to the archive directory instead of deleting it. |
directoryArchive |
null |
Define the directory to move data logs to when they all the messages they contain have been consumed. |
databaseLockedWaitDelay |
10000 |
time (ms) before trying to get acquire a the database lock (used by shared master/slave) |
maxAsyncJobs |
10000 |
the maximum number of asynchronous messages that will be queued awaiting storage (should be the same as the number of concurrent MessageProducers) |
concurrentStoreAndDispatchTopics |
false |
enable the dispatching of Topic messages to interested clients to happen concurrently with message storage |
concurrentStoreAndDispatchQueues |
true |
enable the dispatching of Queue messages to interested clients to happen concurrently with message storage |
2)AMQ持久配置
property name |
default value |
Comments |
directory |
activemq-data |
the path to the directory to use to store the message store data and log files |
useNIO |
true |
use NIO to write messages to the data logs |
syncOnWrite |
false |
sync every write to disk |
maxFileLength |
32mb |
a hint to set the maximum size of the message data logs |
persistentIndex |
true |
use a persistent index for the message logs. If this is false, an in-memory structure is maintained |
maxCheckpointMessageAddSize |
4kb |
the maximum number of messages to keep in a transaction before automatically committing |
cleanupInterval |
30000 |
time (ms) before checking for a discarding/moving message data logs that are no longer used |
indexBinSize |
1024 |
default number of bins used by the index. The bigger the bin size - the better the relative performance of the index |
indexKeySize |
96 |
the size of the index key - the key is the message id |
indexPageSize |
16kb |
the size of the index page - the bigger the page - the better the write performance of the index |
directoryArchive |
archive |
the path to the directory to use to store discarded data logs |
archiveDataLogs |
false |
if true data logs are moved to the archive directory instead of being deleted |
3)systemUsage配置
property name |
default value |
Comments |
memoryUsage |
20M |
amq使用記憶體大小,照amq論壇上說,這個值應該大於所有durable desitination設定的 memoryUsage之和,否則會導致硬碟swap,影響效能。 |
storeUsage |
1G |
kaha資料儲存大小,如果設定不足,效能會下降到1個1個發 |
tempUsage |
100M |
非persistent的訊息儲存在temp區域 |
4)其他配置
4.1)Failover Transport Options
Option Name |
Default |
Description |
transport.timeout |
-1 |
Time that a send operation blocks before failing. |
transport.initialReconnectDelay |
10 |
Time in Milliseconds that the transport waits before attempting to reconnect the first time. |
transport.maxReconnectDelay |
30000 |
The max time in Milliseconds that the transport will wait before attempting to reconnect. |
transport.backOffMultiplier |
2 |
The amount by which the reconnect delay will be multiplied by if useExponentialBackOff is enabled. |
transport.useExponentialBackOff |
true |
Should the delay between connection attempt grow on each try up to the max reconnect delay. |
transport.randomize |
true |
Should the Uri to connect to be chosen at random from the list of available Uris. |
transport.maxReconnectAttempts |
0 |
Maximum number of time the transport will attempt to reconnect before failing (0 means infinite retries) |
transport.startupMaxReconnectAttempts |
0 |
Maximum number of time the transport will attempt to reconnect before failing when there has never been a connection made. (0 means infinite retries) (included in NMS.ActiveMQ v1.5.0+) |
transport.reconnectDelay |
10 |
The delay in milliseconds that the transport waits before attempting a reconnection. |
transport.backup |
false |
Should the Failover transport maintain hot backups. |
transport.backupPoolSize |
1 |
If enabled, how many hot backup connections are made. |
transport.trackMessages |
false |
keep a cache of in-flight messages that will flushed to a broker on reconnect |
transport.maxCacheSize |
256 |
Number of messages that are cached if trackMessages is enabled. |
transport.updateURIsSupported |
true |
Update the list of known brokers based on BrokerInfo messages sent to the client. |
4.2)Connection Options
Option Name |
Default |
Description |
connection.AsyncSend |
false |
Are message sent Asynchronously. |
connection.AsyncClose |
true |
Should the close command be sent Asynchronously |
connection.AlwaysSyncSend |
false |
Causes all messages a Producer sends to be sent Asynchronously. |
connection.CopyMessageOnSend |
true |
Copies the Message objects a Producer sends so that the client can reuse Message objects without affecting an in-flight message. |
connection.ProducerWindowSize |
0 |
The ProducerWindowSize is the maximum number of bytes in memory that a producer will transmit to a broker before waiting for acknowledgement messages from the broker that it has accepted the previously sent messages. In other words, this how you configure the producer flow control window that is used for async sends where the client is responsible for managing memory usage. The default value of 0 means no flow control at the client. See also |
connection.useCompression |
false |
Should message bodies be compressed before being sent. |
connection.sendAcksAsync |
false |
Should message acks be sent asynchronously |
connection.messagePrioritySupported |
true |
Should messages be delivered to the client based on the value of the Message Priority header. |
connection.dispatchAsync |
false |
Should the broker to the connection's consumers. |
4.3)OpenWire Options
Option Name |
Default |
Description |
wireFormat.stackTraceEnabled |
false |
Should the stack trace of exception that occur on the broker be sent to the client? Only used by openwire protocol. |
wireFormat.cacheEnabled |
false |
Should commonly repeated values be cached so that less marshalling occurs? Only used by openwire protocol. |
wireFormat.tcpNoDelayEnabled |
false |
Does not affect the wire format, but provides a hint to the peer that TCP nodelay should be enabled on the communications Socket. Only used by openwire protocol. |
wireFormat.sizePrefixDisabled |
false |
Should serialized messages include a payload length prefix? Only used by openwire protocol. |
wireFormat.tightEncodingEnabled |
false |
Should wire size be optimized over CPU usage? Only used by the openwire protocol. |
wireFormat.maxInactivityDuration |
30000 |
The maximum inactivity duration (before which the socket is considered dead) in milliseconds. On some platforms it can take a long time for a socket to appear to die, so we allow the broker to kill connections if they are inactive for a period of time. Use by some transports to enable a keep alive heart beat feature. Set to a value <= 0 to disable inactivity monitoring. |
maxInactivityDurationInitalDelay |
10000 |
The initial delay in starting the maximum inactivity checks (and, yes, the word 'Inital' is supposed to be misspelled like that) |
5)安全配置
1、控制檯安全配置,開啟conf/jetty.xml檔案,找到
將“false”改為“true”即可。使用者名稱和密碼存放在conf/jetty-realm.properties檔案中。
2、生產者和消費者連線MQ需要密碼
開啟conf/activemq.xml檔案,在
注意必須在
使用者名稱和密碼存放在conf/credentials.properties檔案中
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-1349867/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MyCAT的常見問題分析和解決
- Oracle 惡意攻擊問題分析和解決(一)Oracle
- ORA-01427問題的分析和解決
- JAVA中文比較問題的分析和解決 (轉)Java
- Oracle資料不同步的問題分析和解決思路Oracle
- 關於ORA-01779問題的分析和解決
- 粘包問題原因和解決方法
- dataguard中MRP無法啟動的問題分析和解決
- 透徹分析和解決一切javaWeb專案亂碼問題JavaWeb
- redis分散式鎖的問題和解決Redis分散式
- 最近遇到的問題和解決辦法
- activemq的問題,謝謝MQ
- nginx和Tomcat整合後發生的重定向問題分析和解決NginxTomcat
- Spark 環境問題記錄和解決方法Spark
- 如何診斷和解決db2問題DB2
- Firefox 使用常見問題和解決方法Firefox
- 最新 IDEA 和 Maven 整合問題和解決IdeaMaven
- 設定SecureCRT配色和解決亂碼問題Securecrt
- Redis 常見的效能問題和解決方法Redis
- Redis常見問題和解決辦法梳理Redis
- discuz雲平臺報呼叫遠端介面失敗的問題分析和解決
- Redis常見的效能問題和解決方法UWRedis
- oracle net相關問題的彙總和解決Oracle
- activemq的ObjectMessage的安全問題MQObject
- 浮動元素引起的問題和解決辦法?
- android中The connection to adb is down,問題和解決Android
- 浮動元素引起的問題和解決辦法
- linux Too Many Files 問題檢視和解決方法Linux
- ElasticSearch啟動失敗問題彙總和解決方法Elasticsearch
- 檢測和解決Android應用的效能問題Android
- Tomcat中文亂碼問題的原理和解決方法Tomcat
- Composer 使用過程中遇到的問題和解決方案
- Windows作業系統常見故障問題和解決方案Windows作業系統
- composer依賴相關的問題和解決辦法
- 資料庫檔案複製問題和解決辦法資料庫
- 攝像頭十大常見問題和解決方法
- 10分鐘學會理解和解決MySQL亂碼問題MySql
- Pentaho 使用中發現的幾個問題和解決方法