This blog post explains how to get and understand statistics from WebSphere Liberty on connectionPool usage.
In your MDB application you can have code like
InitialContext ctx = new InitialContext(); ConnectionFactory cf = (ConnectionFactory)ctx.lookup("CF3");
This says lookup the connection defined by CF3 and issue MQCONN for this connection.
In WebSphere Liberty you defined connection information in server.xml. For example
<jmsConnectionFactory jndiName="CF3" id="CF3ID"> <connectionManager maxPoolSize="2" connectionTimeout="7s"/> <properties.wmqJms queueManager="QMA" transportType="BINDINGS" applicationName="Hello"/> </jmsConnectionFactory>
The maxPoolSize gives the maximum number of connections available in this pool.
If server.xml has
<featureManager> <feature>monitor-1.0</feature> </featureManager>
then you can get out statistics on connectionPools using the JMX interface.
In ./usr/servers/test/jvm.options I had
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Which defined the JMX port as 9010, and so I can get information through this port.
Looking at the output
There is documentation here on the connectionPool statistics.
You can use jconsole to get the JMX data, but this is not very usable, so I used jmxquery, which is part of a python package. I installed it using pip install jmxquery.
I used the command
java -jar jmxquery.jar -url service:jmx:rmi:///jndi/rmi://127.0.0.1:9010/jmxrmi -u admin c -p admin -q ‘WebSphere:*’ > outputfile
-q ‘WebSphere:*’ means give all records belonging to the WebSphere component. If you say -q ‘*:*’ you get statistics for all components, see the bottom of the blog post. Example output is given below.
This command wrote all of the output to file outputfile. I then used grep to extract the relevant records.
grep WebSphere:type=ConnectionPoolStats,name outputfile
If you change a parameter in server.xml for the jmsConnectionPool, the pool is deleted, recreated, and the JMX data is reset. If the pool has been reset, or not been used, statistics for that pool are not available. On the first use of the pool the pool is created, and JMX statistics are available.
The JMX data for connectionPools
The data was like
WebSphere:type=ConnectionPoolStats,name=CF3/CreateCount (Long) = 2
The detailed records for WebSphere:type=ConnectionPoolStats,name=CF3 are
- CreateCount (Long) = 2 this is the number of connections created,
- DestroyCount (Long) = 0 this is the number of connections released because the pool was purged,
- WaitTime (Double) = 76.36986301369863 there were insufficient threads. For those threads that had to wait, this is the average wait time before a connection became available,
- InUseTime (Double) = 18.905405405405407 the threads were active this time on average,
- WaitTimeDetails/count (Long) = 98 requests because had to wait,
- WaitTimeDetails/description (String) = Missing,
- WaitTimeDetails/maximumValue (Long) = 110 the maximum wait time in milliseconds,
- WaitTimeDetails/mean (Double) = 78.13265306122449 the average wait time,
- WaitTimeDetails/minimumValue (Long) = 16 the minimum wait time,
- WaitTimeDetails/standardDeviation (Double) = 16.474205982730254 the standard deviation,
- WaitTimeDetails/total (Double) = 7657.0 in milliseconds. 7657/(number of waits 98) = average 78.13 (above),
- WaitTimeDetails/unit (String) = UNKNOWN looks like a bug – this should be milliseconds,
- WaitTimeDetails/variance (Double) = 271.82426517365184 ,
- ManagedConnectionCount (Long) = 2 The total number of managed connections in the free, shared, and unshared pools,
- ConnectionHandleCount (Long) = 0 this is the current handles in use,
- FreeConnectionCount (Long) = 2 this is the number of connections in the pool, but not in use,
- InUseTimeDetails/count (Long) = 101 – number of requests for a connection (ctx.lookup(“CF3”)),
- InUseTimeDetails/description (String) = Missing,
- InUseTimeDetails/maximumValue (Long) = 53 the maximum time the connection as in use in milliseconds,
- InUseTimeDetails/mean (Double) = 18.099009900990097 the average time the connections were in use in milliseconds,
- InUseTimeDetails/minimumValue (Long) = 10 the minimum time the connections were in use in milliseconds,
- InUseTimeDetails/standardDeviation (Double) = 5.63923216261808,
- InUseTimeDetails/total (Double) = 1828.0 in milliseconds. This value(1828)/(number of connections used 101) gives the mean value 18.09 above,
- InUseTimeDetails/unit (String) = UNKNOWN.
Note the order of the record can vary, for example CreateCount, can be first, or nearly last.
After a time interval aged connections can be released. When there is sufficient workload to need more connections, they will be created as needed. If the CreateCount increases significantly during the day, you may either have an irregular workload, or you need to increase you connectionTimeout value, to smooth out the connect/disconnect.
Having WaitTimeDetails/count=0 is good. If this number is large in comparison to InUseTimeDetails/total then the pool is too small.
Other data you can get from JMX
- IBM MQ:type=CommonServices
- java.lang:type=ClassLoading
- java.lang:type=Compilation
- java.lang:type=GarbageCollector
- java.lang:type=Memory
- java.lang:type=Threading
- osgi.core:
- JMImplementation:type=MBeanServerDelegate
- java.util.logging:type=Logging
- java.nio:type=BufferPool,name=direct
- java.lang:type=MemoryManager
- java.lang:type=MemoryPool,name=Code Cache
- java.lang:type=OperatingSystem
- java.lang:type=Runtime
- WebSphere:feature=apiDiscovery,name=APIDiscovery
- WebSphere:feature=kernel,name=ServerInfo
- WebSphere:type=JvmStats
- WebSphere:type=ThreadPoolStats
- WebSphere:type=ConnectionPoolStats ( as described above)
- WebSphere:service=com.ibm.websphere.application.ApplicationMBean,name=CCP