You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Ralph Goers (Jira)" <ji...@apache.org> on 2020/06/29 00:49:00 UTC

[jira] [Resolved] (LOG4J2-2867) ContextDataProvider will cause concurrent threads blocking at the first logging time

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

Ralph Goers resolved LOG4J2-2867.
---------------------------------
    Fix Version/s: 2.14.0
       Resolution: Fixed

> ContextDataProvider will cause concurrent threads blocking at the first logging time
> ------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-2867
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2867
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.13.2, 2.13.3
>         Environment: Java Version: 1.8.0_45
> Web Server: Tomcat 8.0.30
> OS: CentOS 6.8
>            Reporter: Zishun Jiao
>            Priority: Major
>              Labels: performance
>             Fix For: 2.14.0
>
>   Original Estimate: 48h
>  Remaining Estimate: 48h
>
> The recently introduced  `ContextDataProvider` use `ServiceLoader` to find all possible implementations of ContextDataProvider, which will try to scan all jar files. So when many new threads comes in the first logging time concurrently, all thread will be blocking on the` getProviders` method. It will make web service get very bad performance to serve requests in the beginning.
> Here is an example of blocking thread stack:
> at java.util.zip.ZipFile.getEntry (ZipFile.java:309)at java.util.zip.ZipFile.getEntry (ZipFile.java:309)at java.util.jar.JarFile.getEntry (JarFile.java:240)at java.util.jar.JarFile.getJarEntry (JarFile.java:223)at sun.misc.URLClassPath$JarLoader.getResource (URLClassPath.java:1005)at sun.misc.URLClassPath$JarLoader.findResource (URLClassPath.java:983)at sun.misc.URLClassPath$1.next (URLClassPath.java:240)at sun.misc.URLClassPath$1.hasMoreElements (URLClassPath.java:250)at java.net.URLClassLoader$3$1.run (URLClassLoader.java:601)at java.net.URLClassLoader$3$1.run (URLClassLoader.java:599)at java.security.AccessController.doPrivileged (Native Method)at java.net.URLClassLoader$3.next (URLClassLoader.java:598)at java.net.URLClassLoader$3.hasMoreElements (URLClassLoader.java:623)at sun.misc.CompoundEnumeration.next (CompoundEnumeration.java:45)at sun.misc.CompoundEnumeration.hasMoreElements (CompoundEnumeration.java:54)at sun.misc.CompoundEnumeration.next (CompoundEnumeration.java:45)at sun.misc.CompoundEnumeration.hasMoreElements (CompoundEnumeration.java:54)at java.util.ServiceLoader$LazyIterator.hasNextService (ServiceLoader.java:354)at java.util.ServiceLoader$LazyIterator.hasNext (ServiceLoader.java:393)at java.util.ServiceLoader$1.hasNext (ServiceLoader.java:474)at org.apache.logging.log4j.core.impl.ThreadContextDataInjector.getProviders (ThreadContextDataInjector.java:254)at org.apache.logging.log4j.core.impl.ThreadContextDataInjector.access$000 (ThreadContextDataInjector.java:53)at org.apache.logging.log4j.core.impl.ThreadContextDataInjector$ForDefaultThreadContextMap.<init> (ThreadContextDataInjector.java:74)at org.apache.logging.log4j.core.impl.ContextDataInjectorFactory.createDefaultInjector (ContextDataInjectorFactory.java:91)at org.apache.logging.log4j.core.impl.ContextDataInjectorFactory.createInjector (ContextDataInjectorFactory.java:71)at org.apache.logging.log4j.core.async.RingBufferLogEventTranslator.<init> (RingBufferLogEventTranslator.java:40)at org.apache.logging.log4j.core.async.AsyncLogger.getCachedTranslator (AsyncLogger.java:121)at org.apache.logging.log4j.core.async.AsyncLogger.logWithThreadLocalTranslator (AsyncLogger.java:222)at org.apache.logging.log4j.core.async.AsyncLogger.access$000 (AsyncLogger.java:67)at org.apache.logging.log4j.core.async.AsyncLogger$1.log (AsyncLogger.java:152)at org.apache.logging.log4j.core.async.AsyncLogger.log (AsyncLogger.java:136)at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage (AbstractLogger.java:2198)at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion (AbstractLogger.java:2152)at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely (AbstractLogger.java:2135)at org.apache.logging.log4j.spi.AbstractLogger.logMessage (AbstractLogger.java:2011)at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled (AbstractLogger.java:1983)at org.apache.logging.slf4j.Log4jLogger.warn



--
This message was sent by Atlassian Jira
(v8.3.4#803005)