You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Mark Thomas (JIRA)" <ji...@apache.org> on 2014/01/30 13:56:09 UTC

[jira] [Resolved] (DBCP-381) Threads BLOCKED on stress tests

     [ https://issues.apache.org/jira/browse/DBCP-381?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Mark Thomas resolved DBCP-381.
------------------------------

    Resolution: Invalid

The sync on returnObject() was fixed in Pool 1.4 onwards. See POOL-93 and POOL-108 for details.

Resolved as INVALID since the bug was in Pool, not DBCP.

> Threads BLOCKED on stress tests
> -------------------------------
>
>                 Key: DBCP-381
>                 URL: https://issues.apache.org/jira/browse/DBCP-381
>             Project: Commons Dbcp
>          Issue Type: Bug
>            Reporter: Carlos Martinez
>              Labels: BLOCKED, PERFORMANCE, ROLLBACK
>
> Hi,
> We are performing stress tests of OpenCMS. The database used is Oracle one. The pool of connections that OpenCMS is using is the DBCP pool.
> While performing performance tests we see that with minimal load already generated, almost all of the threads in java get "BLOCKED" trying to release back connections to the pool, and the performance of the application is really poor. We also see that the CPU consumption on the application server machine goes up to 100%. We are not generating enough load to cause this consumption. I believe that the CPU is all spent trying to handle those BLOCK threads.
> We did perform a thread dump of the Java on many occasions and the pattern is always similar. Plenty of connections blocked releasing the connection:
> -------------------
> "TP-Processor8" daemon prio=10 tid=0x00007fa2848b4000 nid=0x4713 waiting for monitor entry [0x00007fa2833f8000]
>    java.lang.Thread.State: BLOCKED (on object monitor)
>         at org.apache.commons.pool.impl.GenericObjectPool.returnObject(GenericObjectPool.java:916)
>         - waiting to lock <0x0000000780ba7cc8> (a org.apache.commons.pool.impl.GenericObjectPool)
>         at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:87)
>         - locked <0x00000007811a6f78> (a org.apache.commons.dbcp.PoolableConnection)
>         at org.apache.commons.dbcp.PoolingDriver$PoolGuardConnectionWrapper.close(PoolingDriver.java:269)
>         at org.opencms.ocee.db.transaction.CmsTransactionConnection.close(CmsTransactionConnection.java:79)
>         at org.opencms.ocee.db.transaction.CmsTransaction.close(CmsTransaction.java:121)
>         at org.opencms.ocee.db.transaction.CmsTransactionDbContext.clear(CmsTransactionDbContext.java:99)
>         at org.opencms.db.CmsSecurityManager.readFile(CmsSecurityManager.java:3351)
>         at org.opencms.file.CmsObject.readFile(CmsObject.java:2725)
>         at org.opencms.file.CmsObject.readFile(CmsObject.java:2777)
>         at org.opencms.file.CmsObject.readFile(CmsObject.java:2747)
>         at org.apache.jsp.WEB_002dINF.jsp.online.system.modules.org_opentrends_upf_template.templates.mainUPF_jsp._jspService(mainUPF_jsp.java:654)
>         at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
> -------------
> And one thread active releasing the connection:
> -------------
> "TP-Processor10" daemon prio=10 tid=0x00007fa284b34800 nid=0x4715 runnable [0x00007fa2831f4000]
>    java.lang.Thread.State: RUNNABLE
>         at java.net.SocketInputStream.socketRead0(Native Method)
>         at java.net.SocketInputStream.read(SocketInputStream.java:129)
>         at oracle.net.ns.Packet.receive(Unknown Source)
>         at oracle.net.ns.DataPacket.receive(Unknown Source)
>         at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
>         at oracle.net.ns.NetInputStream.read(Unknown Source)
>         at oracle.net.ns.NetInputStream.read(Unknown Source)
>         at oracle.net.ns.NetInputStream.read(Unknown Source)
>         at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1104)
>         at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1075)
>         at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:106)
>         at oracle.jdbc.driver.T4CConnection.doRollback(T4CConnection.java:568)
>         - locked <0x00000007810e2ac0> (a oracle.jdbc.driver.T4CConnection)
>         at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1164)
>         - locked <0x00000007810e2ac0> (a oracle.jdbc.driver.T4CConnection)
>         at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:328)
>         at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:328)
>         at org.apache.commons.dbcp.PoolableConnectionFactory.passivateObject(PoolableConnectionFactory.java:359)
>         at org.apache.commons.pool.impl.GenericObjectPool.addObjectToPool(GenericObjectPool.java:926)
>         at org.apache.commons.pool.impl.GenericObjectPool.returnObject(GenericObjectPool.java:917)
>         - locked <0x0000000780ba7cc8> (a org.apache.commons.pool.impl.GenericObjectPool)
>         at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:87)
>         - locked <0x00000007810e29b0> (a org.apache.commons.dbcp.PoolableConnection)
>         at org.apache.commons.dbcp.PoolingDriver$PoolGuardConnectionWrapper.close(PoolingDriver.java:269)
>         at org.opencms.ocee.db.transaction.CmsTransactionConnection.close(CmsTransactionConnection.java:79)
>         at org.opencms.ocee.db.transaction.CmsTransaction.close(CmsTransaction.java:121)
>         at org.opencms.ocee.db.transaction.CmsTransactionDbContext.clear(CmsTransactionDbContext.java:99)
>         at org.opencms.db.CmsSecurityManager.readFile(CmsSecurityManager.java:3351)
>         at org.opencms.file.CmsObject.readFile(CmsObject.java:2725)
> ------------
> As we can see the thread releasing the connection is performing a rollback, probably so that the connection gets back clean to the pool.
> In this case the application is not performing Updates/Deletes or Inserts. In the future it will, but not in the stress tests. 
> This is a big issue, as a Rollback is not a light operation, even when it has not to rollback many actions.
> This is affecting the pool, as while the connection is performing rollback nobody can use the pool as it is locked.
> This does not make any sense.
> I believe that what is happening is:
> 1) I lock the pool
> 2) I perform a rollback of the connection
> 3) I return the connection to the pool
> 4) I unlock the pool
> Why is the rollback holding the pool??? The rollback should be done before locking the pool. It would be better if:
> 1) I perform a rollback of the connection
> 2) I lock the pool
> 3) I return the connection to the pool
> 4) I unlock the pool
> I have seen many threads on internet of people having this kind of locking under stress tests, and I believe this could be the cause. The lock should be hold really the shortest time possible.
> Thanks,
> Carlos



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)