during load tests (simulating users connecting to the server), for the first 1750 seconds there is a mean transaction / second rate of about 300-400, with peak of about 700 tr/sec. These transaction are making some use of server's underlying mysql database, at a rate of about 5 - 10 queries per transaction. There are not any joins, views or more complicated stuff, but straightforward queries, db being indexed accordingly too, innoDB storage engine. The machine has plenty of RAM and CPU power, and monitoring reveals even at SQL Exceptions, the machine has way more than 50% free CPU/RAM resources. Db entries are of the order of magnitude 10^5, and still, I have about 20-30 of these exceptions:
2012-06-07 01:56:55 XGateRoster.<init>() SEVERE: Error getting data list for: +39128516@xmpp.xgate.com.hk/offline/XGate/PhoneBook; method took 14672 ms, thread: 878
tigase.db.TigaseDBException: Error getting data list for: +39128516@xmpp.xgate.com.hk/offline/XGate/PhoneBook; method took 14672 ms, thread: 878
at tigase.db.jdbc.JDBCRepository.getDataList(JDBCRepository.java:482)
at tigase.db.UserRepositoryMDImpl.getDataList(UserRepositoryMDImpl.java:225)
at tigase.xmpp.RepositoryAccess.getDataList(RepositoryAccess.java:393)
at tigase.xmpp.RepositoryAccess.getOfflineDataList(RepositoryAccess.java:458)
at tigase.xmpp.impl.XGateRoster.<init>(XGateRoster.java:94)
at sun.reflect.GeneratedConstructorAccessor50.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at tigase.xmpp.impl.DynamicRoster.init_settings(DynamicRoster.java:294)
at tigase.xmpp.impl.DynamicRoster.getDynamicRosters(DynamicRoster.java:214)
at tigase.xmpp.impl.DynamicRoster.getBuddiesList(DynamicRoster.java:137)
at tigase.xmpp.impl.DynamicRoster.addBuddies(DynamicRoster.java:83)
at tigase.xmpp.impl.Presence.broadcastProbe(Presence.java:685)
at tigase.xmpp.impl.Presence.processOutInitial(Presence.java:1518)
at tigase.xmpp.impl.Presence.process(Presence.java:914)
at tigase.server.xmppsession.SessionManager$ProcessorWorkerThread.process(SessionManager.java:2135)
at tigase.util.WorkerThread.run(WorkerThread.java:132)
Caused by: java.sql.SQLException: Query execution was interrupted
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
at com.mysql.jdbc.CallableStatement.executeQuery(CallableStatement.java:894)
at tigase.db.jdbc.JDBCRepository.getUserUID(JDBCRepository.java:668)
at tigase.db.jdbc.JDBCRepository.getUserUID(JDBCRepository.java:1553)
at tigase.db.jdbc.JDBCRepository.getNodeNID(JDBCRepository.java:1539)
at tigase.db.jdbc.JDBCRepository.getDataList(JDBCRepository.java:436)
at tigase.db.UserRepositoryMDImpl.getDataList(UserRepositoryMDImpl.java:225)
at tigase.xmpp.RepositoryAccess.getDataList(RepositoryAccess.java:393)
at tigase.xmpp.RepositoryAccess.getOfflineDataList(RepositoryAccess.java:458)
at tigase.xmpp.impl.XGateRoster.<init>(XGateRoster.java:94)
at sun.reflect.GeneratedConstructorAccessor50.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at tigase.xmpp.impl.DynamicRoster.init_settings(DynamicRoster.java:294)
at tigase.xmpp.impl.DynamicRoster.getDynamicRosters(DynamicRoster.java:214)
at tigase.xmpp.impl.DynamicRoster.getBuddiesList(DynamicRoster.java:137)
at tigase.xmpp.impl.DynamicRoster.addBuddies(DynamicRoster.java:83)
at tigase.xmpp.impl.Presence.broadcastProbe(Presence.java:685)
at tigase.xmpp.impl.Presence.processOutInitial(Presence.java:1518)
at tigase.xmpp.impl.Presence.process(Presence.java:914)
at tigase.server.xmppsession.SessionManager$ProcessorWorkerThread.process(SessionManager.java:2135)
at tigase.util.WorkerThread.run(WorkerThread.java:132)
2012-06-07 01:57:14 XGateRoster.<init>() SEVERE: Error getting data list for: +3919522@xmpp.xgate.com.hk/offline/XGate/PhoneBook; method took 0 ms, thread: 835
tigase.db.TigaseDBException: Error getting data list for: +3919522@xmpp.xgate.com.hk/offline/XGate/PhoneBook; method took 0 ms, thread: 835
at tigase.db.jdbc.JDBCRepository.getDataList(JDBCRepository.java:482)
at tigase.db.UserRepositoryMDImpl.getDataList(UserRepositoryMDImpl.java:225)
at tigase.xmpp.RepositoryAccess.getDataList(RepositoryAccess.java:393)
at tigase.xmpp.RepositoryAccess.getOfflineDataList(RepositoryAccess.java:458)
at tigase.xmpp.impl.XGateRoster.<init>(XGateRoster.java:94)
at sun.reflect.GeneratedConstructorAccessor50.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at tigase.xmpp.impl.DynamicRoster.init_settings(DynamicRoster.java:294)
at tigase.xmpp.impl.DynamicRoster.getDynamicRosters(DynamicRoster.java:214)
at tigase.xmpp.impl.DynamicRoster.setItemExtraData(DynamicRoster.java:361)
at tigase.xmpp.impl.JabberIqRoster.dynamicSetRequest(JabberIqRoster.java:169)
at tigase.xmpp.impl.JabberIqRoster.process(JabberIqRoster.java:329)
at tigase.server.xmppsession.SessionManager$ProcessorWorkerThread.process(SessionManager.java:2135)
at tigase.util.WorkerThread.run(WorkerThread.java:132)
Caused by: java.sql.SQLException: Query execution was interrupted
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
at com.mysql.jdbc.CallableStatement.executeQuery(CallableStatement.java:894)
at tigase.db.jdbc.JDBCRepository.getUserUID(JDBCRepository.java:668)
at tigase.db.jdbc.JDBCRepository.getUserUID(JDBCRepository.java:1553)
at tigase.db.jdbc.JDBCRepository.getNodeNID(JDBCRepository.java:1539)
at tigase.db.jdbc.JDBCRepository.getDataList(JDBCRepository.java:436)
at tigase.db.UserRepositoryMDImpl.getDataList(UserRepositoryMDImpl.java:225)
at tigase.xmpp.RepositoryAccess.getDataList(RepositoryAccess.java:393)
at tigase.xmpp.RepositoryAccess.getOfflineDataList(RepositoryAccess.java:458)
at tigase.xmpp.impl.XGateRoster.<init>(XGateRoster.java:94)
at sun.reflect.GeneratedConstructorAccessor50.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at tigase.xmpp.impl.DynamicRoster.init_settings(DynamicRoster.java:294)
at tigase.xmpp.impl.DynamicRoster.getDynamicRosters(DynamicRoster.java:214)
at tigase.xmpp.impl.DynamicRoster.setItemExtraData(DynamicRoster.java:361)
at tigase.xmpp.impl.JabberIqRoster.dynamicSetRequest(JabberIqRoster.java:169)
at tigase.xmpp.impl.JabberIqRoster.process(JabberIqRoster.java:329)
at tigase.server.xmppsession.SessionManager$ProcessorWorkerThread.process(SessionManager.java:2135)
at tigase.util.WorkerThread.run(WorkerThread.java:132)
I believe the time measurements to be correct as I have double checked them. Why do I get such exceptions ? why is it that sometimes the measured execution time is fairly low (even 0 ms = instant exception throw) ?
Mysql slow logs reveal (just one big issue ?):
root@XMPP:/var/log/mysql# egrep "# Query_time: [1-9]+?\..*" /var/log/mysql/mysql-slow.log.1
# Query_time: 27.826251 Lock_time: 0.000077 Rows_sent: 0 Rows_examined: 2
# Query_time: 2.038984 Lock_time: 0.000272 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.040937 Lock_time: 0.000298 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.039785 Lock_time: 0.000347 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.040286 Lock_time: 0.000242 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.039634 Lock_time: 0.000048 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.039647 Lock_time: 0.000043 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.039711 Lock_time: 0.000059 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.103542 Lock_time: 0.000078 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.104395 Lock_time: 0.000053 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.103512 Lock_time: 0.000201 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.103431 Lock_time: 0.000038 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.375416 Lock_time: 0.000205 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.911025 Lock_time: 0.000039 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.083049 Lock_time: 0.000047 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.081169 Lock_time: 0.000036 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.649307 Lock_time: 0.000233 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.082557 Lock_time: 0.000062 Rows_sent: 0 Rows_examined: 1
# Query_time: 3.129848 Lock_time: 0.000124 Rows_sent: 0 Rows_examined: 1
# Query_time: 3.158479 Lock_time: 0.000083 Rows_sent: 0 Rows_examined: 0
# Query_time: 3.412682 Lock_time: 0.000194 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.900394 Lock_time: 0.000073 Rows_sent: 0 Rows_examined: 0
# Query_time: 3.414437 Lock_time: 0.000068 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.900706 Lock_time: 0.000202 Rows_sent: 0 Rows_examined: 0
# Query_time: 3.195506 Lock_time: 0.000198 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.901220 Lock_time: 0.000323 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.278411 Lock_time: 0.000204 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.284154 Lock_time: 0.000198 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.205004 Lock_time: 0.000342 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.204605 Lock_time: 0.000338 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.205250 Lock_time: 0.000131 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.274901 Lock_time: 0.000059 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.285315 Lock_time: 0.000099 Rows_sent: 0 Rows_examined: 1
# Query_time: 3.303273 Lock_time: 0.000060 Rows_sent: 0 Rows_examined: 1
# Query_time: 3.468223 Lock_time: 0.000041 Rows_sent: 0 Rows_examined: 1
# Query_time: 3.461232 Lock_time: 0.000053 Rows_sent: 0 Rows_examined: 1
# Query_time: 3.460767 Lock_time: 0.000399 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.758039 Lock_time: 0.000309 Rows_sent: 0 Rows_examined: 0
# Query_time: 3.462436 Lock_time: 0.000049 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.757907 Lock_time: 0.000276 Rows_sent: 0 Rows_examined: 0
# Query_time: 4.063776 Lock_time: 0.000183 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.012213 Lock_time: 0.000335 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.232263 Lock_time: 0.000270 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.831812 Lock_time: 0.000052 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.832423 Lock_time: 0.000074 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.232429 Lock_time: 0.000270 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.832328 Lock_time: 0.000053 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.231343 Lock_time: 0.000213 Rows_sent: 0 Rows_examined: 0
# Query_time: 4.234587 Lock_time: 0.000047 Rows_sent: 0 Rows_examined: 1
# Query_time: 4.458741 Lock_time: 0.000180 Rows_sent: 50 Rows_examined: 50
# Query_time: 5.739855 Lock_time: 0.000199 Rows_sent: 0 Rows_examined: 0
# Query_time: 5.726863 Lock_time: 0.000289 Rows_sent: 0 Rows_examined: 0
# Query_time: 5.742442 Lock_time: 0.000052 Rows_sent: 0 Rows_examined: 1
# Query_time: 5.726623 Lock_time: 0.000048 Rows_sent: 0 Rows_examined: 1
# Query_time: 5.727539 Lock_time: 0.000234 Rows_sent: 0 Rows_examined: 0
# Query_time: 5.726928 Lock_time: 0.000222 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.165082 Lock_time: 0.000208 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.161232 Lock_time: 0.000046 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.583766 Lock_time: 0.000249 Rows_sent: 0 Rows_examined: 0
# Query_time: 3.011636 Lock_time: 0.000227 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.510544 Lock_time: 0.000227 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.921829 Lock_time: 0.000091 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.920549 Lock_time: 0.000315 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.922647 Lock_time: 0.000239 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.377067 Lock_time: 0.000208 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.511974 Lock_time: 0.000070 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.360768 Lock_time: 0.000051 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.378182 Lock_time: 0.000104 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.806293 Lock_time: 0.000100 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.378549 Lock_time: 0.000056 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.378903 Lock_time: 0.000088 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.879465 Lock_time: 0.000212 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.020542 Lock_time: 0.000054 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.019749 Lock_time: 0.000493 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.036685 Lock_time: 0.000303 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.019717 Lock_time: 0.000197 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.963536 Lock_time: 0.000161 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.019353 Lock_time: 0.000129 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.019624 Lock_time: 0.000128 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.820161 Lock_time: 0.000051 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.255717 Lock_time: 0.000167 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.413679 Lock_time: 0.000247 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.402931 Lock_time: 0.000148 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.255956 Lock_time: 0.000189 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.353527 Lock_time: 0.000195 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.402936 Lock_time: 0.000204 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.255460 Lock_time: 0.000234 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.169004 Lock_time: 0.000135 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.576578 Lock_time: 0.000039 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.578367 Lock_time: 0.000139 Rows_sent: 1 Rows_examined: 3
# Query_time: 2.154770 Lock_time: 0.000209 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.327091 Lock_time: 0.000123 Rows_sent: 0 Rows_examined: 1
# Query_time: 2.154538 Lock_time: 0.000209 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.674249 Lock_time: 0.000430 Rows_sent: 0 Rows_examined: 0
# Query_time: 2.913024 Lock_time: 0.000076 Rows_sent: 0 Rows_examined: 1
# Query_time: 1.674312 Lock_time: 0.000435 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.992658 Lock_time: 0.000354 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.756505 Lock_time: 0.000247 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.978150 Lock_time: 0.000208 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.979560 Lock_time: 0.000210 Rows_sent: 0 Rows_examined: 0
# Query_time: 1.416010 Lock_time: 0.000458 Rows_sent: 0 Rows_examined: 0
etc...
I have tried changing the database jdbc driver, and I have made sure no such bugs are documented in the mysql version I am currently using.
Thank you all for your input!