You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-user@logging.apache.org by John Dewsnip <jo...@hotmail.com> on 2005/08/10 16:19:23 UTC

lock contention and scalability with the JDBC appender

We have hit a problem with log4j 1.29 this is causing the lock contention 
and as a result of this the CPU does not load. This stops the application 
scaling.

We are using a JDBC appender for application auditing and are dumping to a 
database certain request elements. The set up is

client -> async appender --> jdbc appender

We have lots of threads waiting for a lock:

"ExecuteThread: '23' for queue: 'weblogic.kernel.Default'" daemon prio=5 
tid=0x0082a510 nid=0x26 waiting for monitor entry [89bfe000..89bffc28]
        at org.apache.log4j.Category.callAppenders(Category.java:186)
        - waiting to lock <0x9e4d9090> (a org.apache.log4j.Logger)
        at org.apache.log4j.Category.forcedLog(Category.java:372)
        at org.apache.log4j.Category.log(Category.java:864)
        at uk.zoop.core.logging.Logger.writeLog(Unknown Source)
        at uk.zoop.si.SILoggingUtils.logAuditInfo(Unknown Source)
        at uk.zoop.si.chain.Audit.execute(Unknown Source)
        at 
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
        at uk.zoop.si.chain.Head.execute(Unknown Source)
        at uk.zoop.si.listeners.http.HTTPSILChainServlet.doService(Unknown 
Source)
        at uk.zoop.si.listeners.http.HTTPSILChainServlet.doPost(Unknown 
Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at 
weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1006)
        at 
weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:419)
        at 
weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:315)
        at 
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6718)
        at 
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at 
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
        at 
weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3764)
        at 
weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2644)
        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
This lock is held by:
"ExecuteThread: '18' for queue: 'weblogic.kernel.Default'" daemon prio=5 
tid=0x00e42ca0 nid=0x21 in Object.wait() [8a0fe000..8a0ffc28]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x9e4d0620> (a org.apache.log4j.helpers.BoundedFIFO)
        at java.lang.Object.wait(Object.java:429)
        at org.apache.log4j.AsyncAppender.append(AsyncAppender.java:85)
        - locked <0x9e4d0620> (a org.apache.log4j.helpers.BoundedFIFO)
        at 
org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:221)
        - locked <0x9e5739a0> (a org.apache.log4j.AsyncAppender)
        at 
org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:57)
        at org.apache.log4j.Category.callAppenders(Category.java:187)
        - locked <0x9e4d9090> (a org.apache.log4j.Logger)
        at org.apache.log4j.Category.forcedLog(Category.java:372)
        at org.apache.log4j.Category.log(Category.java:864)
        at uk.zoop.core.logging.Logger.writeLog(Unknown Source)
        at uk.zoop.si.SILoggingUtils.logAuditInfo(Unknown Source)
        at uk.zoop.si.chain.Audit.execute(Unknown Source)
        at 
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
        at uk.zoop.si.chain.Head.execute(Unknown Source)
        at uk.zoop.si.listeners.http.HTTPSILChainServlet.doService(Unknown 
Source)
        at uk.zoop.si.listeners.http.HTTPSILChainServlet.doPost(Unknown 
Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at 
weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1006)
        at 
weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:419)
        at 
weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:315)
        at 
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6718)
        at 
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at 
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
        at 
weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3764)
        at 
weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2644)
        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)

and this thread appears to be in an apparent deadlock. This sounds like the 
following problem:

http://issues.apache.org/bugzilla/show_bug.cgi?id=24159
http://www.jboss.org/index.html?module=bb&op=viewtopic&t=56740

Is this a common problem with log4j under high load and with a JDBC appender 
and are there any ways around this? I have been using log4j for sometime but 
never the JDBC appender. Thoughts are moving to 1.3 and adding the changes 
suggested in 24159.

Any other ideas are welcome as we may not be able to move to 1.3 due to BEA 
not supporting it?

TIA

John Dewsnip



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-user-help@logging.apache.org


Re: lock contention and scalability with the JDBC appender

Posted by Jim Rice <ji...@gmail.com>.
John,

Just a quick thought. What about using a JMS Appender out of Log4J to an MDB 
to handle the JDBC communications?

Jim

On 8/10/05, John Dewsnip <jo...@hotmail.com> wrote:
> 
> We have hit a problem with log4j 1.29 this is causing the lock contention
> and as a result of this the CPU does not load. This stops the application
> scaling.
> 
> We are using a JDBC appender for application auditing and are dumping to a
> database certain request elements. The set up is
> 
> client -> async appender --> jdbc appender
> 
> We have lots of threads waiting for a lock:
> 
> "ExecuteThread: '23' for queue: 'weblogic.kernel.Default'" daemon prio=5
> tid=0x0082a510 nid=0x26 waiting for monitor entry [89bfe000..89bffc28]
> at org.apache.log4j.Category.callAppenders(Category.java:186)
> - waiting to lock <0x9e4d9090> (a org.apache.log4j.Logger)
> at org.apache.log4j.Category.forcedLog(Category.java:372)
> at org.apache.log4j.Category.log(Category.java:864)
> at uk.zoop.core.logging.Logger.writeLog(Unknown Source)
> at uk.zoop.si.SILoggingUtils.logAuditInfo(Unknown Source)
> at uk.zoop.si.chain.Audit.execute(Unknown Source)
> at
> org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
> at uk.zoop.si.chain.Head.execute(Unknown Source)
> at uk.zoop.si.listeners.http.HTTPSILChainServlet.doService(Unknown
> Source)
> at uk.zoop.si.listeners.http.HTTPSILChainServlet.doPost(Unknown
> Source)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
> weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(
> ServletStubImpl.java:1006)
> at
> weblogic.servlet.internal.ServletStubImpl.invokeServlet(
> ServletStubImpl.java:419)
> at
> weblogic.servlet.internal.ServletStubImpl.invokeServlet(
> ServletStubImpl.java:315)
> at
> weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run
> (WebAppServletContext.java:6718)
> at
> weblogic.security.acl.internal.AuthenticatedSubject.doAs(
> AuthenticatedSubject.java:321)
> at
> weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
> at
> weblogic.servlet.internal.WebAppServletContext.invokeServlet(
> WebAppServletContext.java:3764)
> at
> weblogic.servlet.internal.ServletRequestImpl.execute(
> ServletRequestImpl.java:2644)
> at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
> at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
> This lock is held by:
> "ExecuteThread: '18' for queue: 'weblogic.kernel.Default'" daemon prio=5
> tid=0x00e42ca0 nid=0x21 in Object.wait() [8a0fe000..8a0ffc28]
> at java.lang.Object.wait(Native Method)
> - waiting on <0x9e4d0620> (a org.apache.log4j.helpers.BoundedFIFO)
> at java.lang.Object.wait(Object.java:429)
> at org.apache.log4j.AsyncAppender.append(AsyncAppender.java:85)
> - locked <0x9e4d0620> (a org.apache.log4j.helpers.BoundedFIFO)
> at
> org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:221)
> - locked <0x9e5739a0> (a org.apache.log4j.AsyncAppender)
> at
> org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(
> AppenderAttachableImpl.java:57)
> at org.apache.log4j.Category.callAppenders(Category.java:187)
> - locked <0x9e4d9090> (a org.apache.log4j.Logger)
> at org.apache.log4j.Category.forcedLog(Category.java:372)
> at org.apache.log4j.Category.log(Category.java:864)
> at uk.zoop.core.logging.Logger.writeLog(Unknown Source)
> at uk.zoop.si.SILoggingUtils.logAuditInfo(Unknown Source)
> at uk.zoop.si.chain.Audit.execute(Unknown Source)
> at
> org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
> at uk.zoop.si.chain.Head.execute(Unknown Source)
> at uk.zoop.si.listeners.http.HTTPSILChainServlet.doService(Unknown
> Source)
> at uk.zoop.si.listeners.http.HTTPSILChainServlet.doPost(Unknown
> Source)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> at
> weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(
> ServletStubImpl.java:1006)
> at
> weblogic.servlet.internal.ServletStubImpl.invokeServlet(
> ServletStubImpl.java:419)
> at
> weblogic.servlet.internal.ServletStubImpl.invokeServlet(
> ServletStubImpl.java:315)
> at
> weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run
> (WebAppServletContext.java:6718)
> at
> weblogic.security.acl.internal.AuthenticatedSubject.doAs(
> AuthenticatedSubject.java:321)
> at
> weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
> at
> weblogic.servlet.internal.WebAppServletContext.invokeServlet(
> WebAppServletContext.java:3764)
> at
> weblogic.servlet.internal.ServletRequestImpl.execute(
> ServletRequestImpl.java:2644)
> at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
> at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
> 
> and this thread appears to be in an apparent deadlock. This sounds like 
> the
> following problem:
> 
> http://issues.apache.org/bugzilla/show_bug.cgi?id=24159
> http://www.jboss.org/index.html?module=bb&op=viewtopic&t=56740
> 
> Is this a common problem with log4j under high load and with a JDBC 
> appender
> and are there any ways around this? I have been using log4j for sometime 
> but
> never the JDBC appender. Thoughts are moving to 1.3 and adding the changes
> suggested in 24159.
> 
> Any other ideas are welcome as we may not be able to move to 1.3 due to 
> BEA
> not supporting it?
> 
> TIA
> 
> John Dewsnip
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
> For additional commands, e-mail: log4j-user-help@logging.apache.org
> 
>