Threading for IBM® MQ
The IBM® MQ adapter is thread-safe on the Windows™ and Linux platforms. However, due to the IBM® MQ default system configuration parameters for queues and queue managers, the default IBM® MQ resources might be insufficient to support multithreading with the IBM® MQ adapter.
When operating in the multithreaded mode, the flow engine executes one thread for each map being concurrently executed. In addition to the map thread, the IBM® MQ queue manager connection for each distinct queue manager on a source or target card requires a separate connection thread. Because IBM® MQ does not allow connection sharing between threads, each map thread maintains its own set of connection threads.
In addition to the map and connection threads, the IBM® MQ system spawns threads to service internal requests and processes. The result is that, as the number of concurrent maps increases, the use of IBM® MQ and system resources multiplies. When the system resources exceed a threshold based upon the IBM® MQ and system configuration settings, the excessive thread context-switching and system memory resource allocation can significantly reduce the efficiency of the overall IBM® MQ message throughput.
In addition to the reduction in efficiency, it is possible that when the IBM® MQ systems resources are exceeded, the IBM® MQ behavior can become unpredictable and can result in messages being ignored on event queues.
To address these limitations, the following recommendations should be implemented:
- Limit the number of concurrent messaging adapter threads to 20. This is a configuration parameter (MaxThreads) set in the dtx.ini file.
- Ensure that the maximum number of handles (queue and queue manager connections)
supported by the queue manager exceeds the total number of messaging adapter and IBM® MQ threads. This value can be changed by using an
MQSC command at the runmqsc prompt as:
alter qmgr MAXHANDS(2048)
- Set the maximum number of uncommitted messages
allowed by the queue manager to an acceptably large value:
alter qmgr MAXUMSGS(100000)
- Set the maximum number of messages allowed on a queue to an acceptable value:
alter ql(my.queue.name) MAXDEPTH(200000)