Tuning ActiveMQ Artemis
These are some changes you can make to achieve optimum performance when using ActiveMQ Artemis as a broker for Martini Runtime.
As much as possible, avoid using
javax.jms.ObjectMessage. This message type is convenient to use as it can contain
any serializable information. However, Java serialization comes with a cost to performance and takes a lot of space.
If possible, use other types such as
java.jms.TextMessage, especially when you only require simple text message
AUTO_ACKNOWLEDGE mode as much as possible. Using this mode, messages are automatically acknowledged but
requires an extra message to be sent which means more traffic. Use
DUPS_OK_ACKNOWLEDGE instead to lazily acknowledge
messages but only if your use case allows duplicated messages. You can also use
CLIENT_ACKNOWLEDGE and batch the
acknowledgements at a cost of code complexity.
Avoid publishing durable messages if they're not needed. To survive a broker restart, durable messages require persistence which may be a waste of space if your use case does not actually need this feature.
Use the recommended file store. By default, ActiveMQ Artemis uses its own file journal which is highly optimized for messaging systems. It can support JDBC persistence but using this will incur the performance overhead of using databases.
TCP buffer size
Consider configuring the TCP buffer size. Having a large buffer size increases the performance of message exchanges provided your network is fast. However, if this is too large, the buffer may accumulate more data than the application can process. If you are running on Linux, your OS may already include auto-tuning. In this case, it is better to leave the tuning to the OS.
Like Martini Runtime or any other Java application, ActiveMQ Artemis runs on a Java Virtual Machine which can be tuned
for higher performance. Make sure the JVM is configured to have as much as memory it can have. Use the JVM arguments
-Xmx to set the memory. Also take advantage of parallel garbage collection by specifying
-XX:+UseParallelOldGC as a JVM argument.
File handle limit
ActiveMQ Artemis can generate and open a lot files when using concurrent connections.
You may reach your OS's file handle/descriptor limit. Use the command
ulimit -n [number] to configure this.
Exchanging big chunks of messages may hurt your throughput. Ensure that your messages only contain the data that you need to minimize the overhead of message transfers.
To learn more about other optimizations, check out the official performance tuning page of ActiveMQ Artemis.