On Thu, Jul 2, 2015 at 6:18 AM, Remko Popma <[email protected]> wrote:
> Yes, that could still work: We could use a ThreadLocal containing a custom > class which holds the lastTimestamp, cachedDateString as well as a > SimpleDateFormat instance. > > As Jess pointed out, we would also need a way to clear the ThreadLocal > when the LoggerContext is stopped (to prevent memory leaks in web apps). > This may be the third usage of ThreadLocals in log4j2 now, so it may be > worth creating a reusable mechanism for this. > One idea would be to have a ThreadLocal registry in the LoggerContext, > where the LoggerContext is responsible for cleaning up all registered > ThreadLocals in its stop() method. > > Thoughts? > I'm wondering what the performance cost are of doing a ThreadLocal.get() vs. synchronized(this) on each call to format(). Gary > > Remko.. > Sent from my iPhone > > On 2015/07/02, at 22:00, Gary Gregory <[email protected]> wrote: > > What about storing a SimpleDateFormat in a ThreadLocal? > > But, more importantly and aside from SimpleDateFormat not being > thread-safe [1], I thought we used synchronized to keep > the lastTimestamp and cachedDateString ivar perfectly matched up: > > public void format(final LogEvent event, final StringBuilder output) { > final long timestamp = event.getTimeMillis(); > > synchronized (this) { > if (timestamp != lastTimestamp) { > lastTimestamp = timestamp; > cachedDateString = formatter.format(timestamp); > } > } > output.append(cachedDateString); > } > > But #2, lastTimestamp and cachedDateString are not volatile, so do we > really care? > > Gary > > [1] Javadoc: Date formats are not synchronized. > * It is recommended to create separate format instances for each thread. > * If multiple threads access a format concurrently, it must be > synchronized > * externally. > > > On Thu, Jul 2, 2015 at 5:34 AM, Ralph Goers <[email protected]> > wrote: > >> The date pattern converter will be locking because it uses >> SimpleDateFormat to format the date. This can be changed in Java 8, but >> the only alternative until then is to use the Joda Time library and we have >> been reluctant to be reliant on third party libraries for such core >> components. >> >> Sent from my iPad >> >> On Jul 2, 2015, at 3:44 AM, "[email protected]" <[email protected]> wrote: >> >> Thanks Gary. >> >> Limit number of threads can help alleviate the problem, but can't make it >> disappear. Especially when it happens during midnight when the workload >> will far below the average than the day,but we have no such problems >> happens during day. >> >> I didn't dive into the code to see what it is doing within the >> synchronized block,which takes so much time. >> >> I still think there should be something that is problematic in log4j. >> >> ------------------------------ >> [email protected] >> >> >> *From:* Gary Gregory <[email protected]> >> *Date:* 2015-07-02 17:35 >> *To:* Log4J Developers List <[email protected]> >> *Subject:* Re: Re: Log4j2 RollingFileAppender deadlock issue >> and let's be clear, unlike the subject of this thread, there is no >> deadlock here, at least not in the thread dump you shared; the application >> appears hung but is in fact slowed down to a crawl. IMO that is ;-) >> >> Gary >> >> On Thu, Jul 2, 2015 at 2:34 AM, Gary Gregory <[email protected]> >> wrote: >> >>> The more threads you run to service additional requests is making the >>> problem worse IMO. This likely causes swapping out the wazoo. I would bind >>> the thread pool to try to avoid >>> >>> >>> in service. >>> >>> Gary >>> >>> On Thu, Jul 2, 2015 at 2:25 AM, [email protected] <[email protected]> wrote: >>> >>>> Thanks Gary. >>>> So, it's abnormal for so many (2000+)threads to wait for the lock. The >>>> workload of our application is not very high. So, It is kind of too long >>>> for the <0x0000000772fe2860> owner thread to unlock it. >>>> >>>> 6k threads in total is abnormal, as we are using *unlimited* thread >>>> pool in our code to do HTTP requests to other services when responding >>>> user's request. Since the threads of the thread pool is waiting for the >>>> lock, so the thread pool has to kick off new threads when we throw tasks to >>>> it. >>>> >>>> >>>> >>>> >>>> ------------------------------ >>>> [email protected] >>>> >>>> >>>> *From:* Gary Gregory <[email protected]> >>>> *Date:* 2015-07-02 16:55 >>>> *To:* Log4J Developers List <[email protected]> >>>> *Subject:* Re: Re: Log4j2 RollingFileAppender deadlock issue >>>> Wow, > 6k threads? Is that normal for your application? >>>> >>>> I do see two locks on two DatePatternConverter instances, and both are >>>> working: >>>> >>>> "resin-port-7280-7309" daemon prio=10 tid=0x00002ba94d16e000 nid=0x69e6 >>>> runnable [0x00002bab56be5000] >>>> java.lang.Thread.State: RUNNABLE >>>> at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:64) >>>> at java.lang.StringBuffer.<init>(StringBuffer.java:96) >>>> at java.text.Format.format(Format.java:157) >>>> at >>>> org.apache.logging.log4j.core.pattern.DatePatternConverter$PatternFormatter.format(DatePatternConverter.java:50) >>>> at >>>> org.apache.logging.log4j.core.pattern.DatePatternConverter.format(DatePatternConverter.java:251) >>>> - locked <0x00000007a2cecaa0> (a >>>> org.apache.logging.log4j.core.pattern.DatePatternConverter) >>>> at >>>> org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:36) >>>> at >>>> org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:189) >>>> ... >>>> "DataChannel-1-thread-802" prio=10 tid=0x00002ba8c0022800 nid=0x1fbc >>>> runnable [0x00002ba983230000] >>>> java.lang.Thread.State: RUNNABLE >>>> at java.lang.StringBuffer.toString(StringBuffer.java:561) >>>> - locked <0x0000000772fe2860> (a java.lang.StringBuffer) >>>> at java.text.Format.format(Format.java:157) >>>> at >>>> org.apache.logging.log4j.core.pattern.DatePatternConverter$PatternFormatter.format(DatePatternConverter.java:50) >>>> at >>>> org.apache.logging.log4j.core.pattern.DatePatternConverter.format(DatePatternConverter.java:251) >>>> - locked <0x00000007a2cecc08> (a >>>> org.apache.logging.log4j.core.pattern.DatePatternConverter) >>>> at >>>> org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:36) >>>> at >>>> org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:189) >>>> >>>> Lots (> 2k) of threads are waiting on these two locks. >>>> >>>> So that is all 'normal' in the sense that I do not see a deadlock, this >>>> is more of a starvation scenario. >>>> >>>> -- >>>> >>>> Tangent for us Log4j devs: >>>> >>>> It sure is lame that java.text.Format still uses a StringBuffer >>>> internally instead of a StringBuilder, which would be faster. >>>> >>>> Looking at reusing Commons Lang's FastDateParser would not help since >>>> it does not add StringBuilder version of the StringBuffer APIs. >>>> >>>> Gary >>>> >>>> >>>> On Thu, Jul 2, 2015 at 1:26 AM, [email protected] <[email protected]> >>>> wrote: >>>> >>>>> Sorry, looks that I forgot to attach the thread dump file. >>>>> >>>>> ------------------------------ >>>>> [email protected] >>>>> >>>>> >>>>> *From:* [email protected] >>>>> *Date:* 2015-07-02 16:25 >>>>> *To:* log4j-dev <[email protected]> >>>>> *Subject:* Re: Re: Log4j2 RollingFileAppender deadlock issue >>>>> Thanks Gary for the reply. >>>>> The log related stuff is: >>>>> >>>>> <log4j2.version>2.0.2</log4j2.version> >>>>> <log4j.version>1.2.16</log4j.version> >>>>> <slf4j.version>1.7.7</slf4j.version> >>>>> >>>>> I have the thread dump in question ,and attach it in the attachment. >>>>> >>>>> Thanks you! >>>>> >>>>> ------------------------------ >>>>> [email protected] >>>>> >>>>> >>>>> *From:* Gary Gregory <[email protected]> >>>>> *Date:* 2015-07-02 15:57 >>>>> *To:* Log4J Developers List <[email protected]> >>>>> *Subject:* Re: Log4j2 RollingFileAppender deadlock issue >>>>> Hello, >>>>> >>>>> What version of Log4j are you using? >>>>> >>>>> Can you post the whole thread dump? You can capture it from VisualVM >>>>> (jvisualvm) which ships with the JDK). >>>>> >>>>> Gary >>>>> >>>>> On Wed, Jul 1, 2015 at 10:36 PM, [email protected] <[email protected]> >>>>> wrote: >>>>> >>>>>> >>>>>> Hi,log4j developers, >>>>>> >>>>>> I am using log4j2 to do log. Recently I have encountered an >>>>>> RollingFileAppender deadlock issue from time to time which happens around >>>>>> 12:00 am ~03:00am. >>>>>> When I dump the thread, there are lots of BLOCKED threads that >>>>>> waiting for the lock 0x00000007a2cecaa0. >>>>>> >>>>>> Following is my log4j configuration in log4j2.xml: >>>>>> >>>>>> <RollingFile name="rolling" fileName="/data/logs/app/server.log" >>>>>> filePattern="/data/logs/app/server.log.%d{yyyy-MM-dd}"> >>>>>> <PatternLayout pattern="[%-5level] [%d{yyyy-MM-dd HH:mm:ss}] >>>>>> [%C{1}:%M:%L] %m%n" /> >>>>>> <Policies> >>>>>> <TimeBasedTriggeringPolicy /> >>>>>> </Policies> >>>>>> <DefaultRolloverStrategy max="30"/> >>>>>> </RollingFile> >>>>>> >>>>>> Is this a bug or there is some misconfiguration in my configuration. >>>>>> Is there a way that I can work around this? It happens in our production >>>>>> environment. >>>>>> >>>>>> <Catch(07-02-13-3(07-02-17-52-37).jpg> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> ------------------------------ >>>>>> [email protected] >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> E-Mail: [email protected] | [email protected] >>>>> Java Persistence with Hibernate, Second Edition >>>>> <http://www.manning.com/bauer3/> >>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>> Blog: http://garygregory.wordpress.com >>>>> Home: http://garygregory.com/ >>>>> Tweet! http://twitter.com/GaryGregory >>>>> [image: 提示图标] 邮件带有附件预览链接,若您转发或回复此邮件时不希望对方预览附件,建议您手动删除链接。 >>>>> 共有 *1* 个附件 >>>>> Catch(07-02-13-34-56).jpg(1M) 极速下载 >>>>> <http://preview.mail.163.com/xdownload?filename=Catch%2807-02-13-34-56%29.jpg&mid=xtbBEQQrgVD%2BdaYDbgAAsv&part=3&sign=455fc16698556220f55a79d0de214c25&time=1435824425&uid=bit1129%40163.com> >>>>> 在线预览 >>>>> <http://preview.mail.163.com/preview?mid=xtbBEQQrgVD%2BdaYDbgAAsv&part=3&sign=455fc16698556220f55a79d0de214c25&time=1435824425&uid=bit1129%40163.com> >>>>> >>>>> >>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: [email protected] >>>>> For additional commands, e-mail: [email protected] >>>>> >>>> >>>> >>>> >>>> -- >>>> E-Mail: [email protected] | [email protected] >>>> Java Persistence with Hibernate, Second Edition >>>> <http://www.manning.com/bauer3/> >>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>> Spring Batch in Action <http://www.manning.com/templier/> >>>> Blog: http://garygregory.wordpress.com >>>> Home: http://garygregory.com/ >>>> Tweet! http://twitter.com/GaryGregory >>>> [image: 提示图标] 邮件带有附件预览链接,若您转发或回复此邮件时不希望对方预览附件,建议您手动删除链接。 >>>> 共有 *1* 个附件 >>>> Catch(07-02-13-3(07-02-16-25-44).jpg(1M) 极速下载 >>>> <http://preview.mail.163.com/xdownload?filename=Catch%2807-02-13-3%2807-02-16-25-44%29.jpg&mid=1tbiqxUrgVUL5JhKtgAAsK&part=3&sign=23395f9d62f60d2dbad11e39911e54c8&time=1435827868&uid=bit1129%40163.com> >>>> 在线预览 >>>> <http://preview.mail.163.com/preview?mid=1tbiqxUrgVUL5JhKtgAAsK&part=3&sign=23395f9d62f60d2dbad11e39911e54c8&time=1435827868&uid=bit1129%40163.com> >>>> >>>> >>> >>> >>> -- >>> E-Mail: [email protected] | [email protected] >>> Java Persistence with Hibernate, Second Edition >>> <http://www.manning.com/bauer3/> >>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>> Spring Batch in Action <http://www.manning.com/templier/> >>> Blog: http://garygregory.wordpress.com >>> Home: http://garygregory.com/ >>> Tweet! http://twitter.com/GaryGregory >>> >> >> >> >> -- >> E-Mail: [email protected] | [email protected] >> Java Persistence with Hibernate, Second Edition >> <http://www.manning.com/bauer3/> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >> Spring Batch in Action <http://www.manning.com/templier/> >> Blog: http://garygregory.wordpress.com >> Home: http://garygregory.com/ >> Tweet! http://twitter.com/GaryGregory >> [image: 提示图标] 邮件带有附件预览链接,若您转发或回复此邮件时不希望对方预览附件,建议您手动删除链接。 >> 共有 *1* 个附件 >> Catch(07-02-13-3(07-02-17-13-37).jpg(1M) 极速下载 >> <http://preview.mail.163.com/xdownload?filename=Catch%2807-02-13-3%2807-02-17-13-37%29.jpg&mid=1tbiqwYrgVUL5JjPdwAAsd&part=3&sign=9f422144b7596ead1d7a91185a34196d&time=1435829869&uid=bit1129%40163.com> >> 在线预览 >> <http://preview.mail.163.com/preview?mid=1tbiqwYrgVUL5JjPdwAAsd&part=3&sign=9f422144b7596ead1d7a91185a34196d&time=1435829869&uid=bit1129%40163.com> >> >> > > > -- > E-Mail: [email protected] | [email protected] > Java Persistence with Hibernate, Second Edition > <http://www.manning.com/bauer3/> > JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> > Spring Batch in Action <http://www.manning.com/templier/> > Blog: http://garygregory.wordpress.com > Home: http://garygregory.com/ > Tweet! http://twitter.com/GaryGregory > > -- E-Mail: [email protected] | [email protected] Java Persistence with Hibernate, Second Edition <http://www.manning.com/bauer3/> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> Spring Batch in Action <http://www.manning.com/templier/> Blog: http://garygregory.wordpress.com Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory
