When I finish performance testing I will add graphs to the Performance
section of the gc-free manual page so that users can make an informed
decision. (The below one is an example.)

So far, it seems that even with the garbage-free logging enabled,
synchronous logging throughput (the green line) is usually slightly faster
than it was with 2.5 (the purple line). So I think making garbage-free the
default is acceptable. Also, users who care about logging throughput will
be logging asynchronously, not synchronously: this scales much better with
the number of application threads.



​

On Mon, Apr 18, 2016 at 9:57 PM, Mikael Ståldal <mikael.stal...@magine.com>
wrote:

> Is it wise to enable by default given that "multi-threaded applications
> that use synchronous logging may see worse performance"?
>
> On Mon, Apr 18, 2016 at 2:22 PM, Remko Popma <remko.po...@gmail.com>
> wrote:
>
>> Enabled, except for web apps; for those log4j will be low garbage.
>>
>> See the first paragraph of the Configuration section in the manual page.
>>
>> Please let me know if this is not clear. (The fact that you asked means
>> this probably needs improvement...)
>>
>> Sent from my iPhone
>>
>> On 2016/04/18, at 20:18, Mikael Ståldal <mikael.stal...@magine.com>
>> wrote:
>>
>> Will garbage-free logging be enabled or disabled by default?
>>
>> On Mon, Apr 18, 2016 at 2:58 AM, Remko Popma (JIRA) <j...@apache.org>
>> wrote:
>>
>>>
>>>     [
>>> https://issues.apache.org/jira/browse/LOG4J2-1297?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15245018#comment-15245018
>>> ]
>>>
>>> Remko Popma commented on LOG4J2-1297:
>>> -------------------------------------
>>>
>>> TODO allocate many temporary objects -> allocate temporary objects
>>>
>>> TODO multi-threaded applications that use synchronous logging may see
>>> worse performance: the lock that was previously only around the IO
>>> operation is widened to include the text formatting and conversion to
>>> bytes. -> _synchronous_ logging performance may be worse for multi-threaded
>>> applications in this mode due to synchronization on the shared buffer. If
>>> your application is multi-threaded and logging performance is important,
>>> consider using Async Loggers.
>>>
>>> TODO Caution: Only dates in the predefined formats are garbage-free ->
>>> Caution: Only the predefined date formats are garbage-free
>>>
>>> TODO "(Note that Log4j may call toString() on message and parameter
>>> objects when garbage-free logging is disabled because system property
>>> log4j2.enable.threadlocals is set to "false".)" -> Log4j may call
>>> toString() on message and parameter objects when garbage-free logging is
>>> disabled (when system property log4j2.enable.threadlocals is set to
>>> "false".)
>>>
>>> TODO "made an effort to make logging code garbage-free" -> "made an
>>> effort to make logging garbage-free"
>>>
>>>
>>> > Document "gc-free" configuration and performance
>>> > ------------------------------------------------
>>> >
>>> >                 Key: LOG4J2-1297
>>> >                 URL: https://issues.apache.org/jira/browse/LOG4J2-1297
>>> >             Project: Log4j 2
>>> >          Issue Type: New Feature
>>> >          Components: Documentation
>>> >    Affects Versions: 2.5
>>> >            Reporter: Remko Popma
>>> >            Assignee: Remko Popma
>>> >             Fix For: 2.6
>>> >
>>> >         Attachments: log4j-2.5-FlightRecording.png,
>>> log4j-2.6-FlightRecording.png
>>> >
>>> >
>>> > Update the site with a description of which configurations are GC-free
>>> (i.e., that don't create temporary objects in steady running state).
>>> > Currently that means
>>> > * Loggers are all asynchronous (Log4jContextSelector is set to
>>> org.apache.logging.log4j.core.async.AsyncLoggerContextSelector).
>>> > * The configuration does not contain a <Properties> section.
>>> > * The "steady-state" appenders are either RandomAccessFile or
>>> RollingRandomAccessFile Appenders (logging to any other appender will cause
>>> temporary objects to be created - including ConsoleAppender).
>>> > * The Layout is a PatternLayout that uses one of the pre-defined date
>>> formats, does not have any regular expression replacements, and does not
>>> have lookups (TODO: may need to restrict this further).
>>> > * The thread name is cached (this is the [default|
>>> https://issues.apache.org/jira/browse/LOG4J2-467]). Running with
>>> -DAsyncLogger.ThreadNameStrategy=UNCACHED will create garbage.
>>> > * In user code, when logging a parameterized message, the number of
>>> parameters is no more than ... (TBD pending discussion in LOG4J2-1278).
>>> > * In user code, when logging a parameterized message, parameters of
>>> primitive type are boxed in a reused StringBuilder (Log4j provides a
>>> utility to make this relatively painless).
>>> > Even with the above restrictions, Log4j may occasionally create
>>> garbage:
>>> > * Initially StringBuilders are presized to 128 characters. They may
>>> grow for larger messages (contributing to garbage in Old Gen). If  the
>>> StringBuilder grows beyond 512 characters it is trimmed back to 512
>>> characters to prevent memory leaks from excessively long messages. (TODO:
>>> the resizing algorithm is {{size = value.length * 2 + 2}}, so a better
>>> cutoff value is 518.)
>>> > * Messages containing {{"$\{"}} will be converted to a String and
>>> StrSubstitutor will be used to replace occurences of variables with their
>>> matching values. Multiple temporary objects are created during this process.
>>> > Furthermore, we need to explain that some of this functionality
>>> depends on ThreadLocals and so is disabled by default in web applications
>>> to prevent memory leaks. The page should also explain how to manually
>>> switch off the use of ThreadLocals.
>>> > Finally, the page should show a performance test comparison similar to
>>> the [performance section|
>>> http://logging.apache.org/log4j/2.x/manual/async.html#Performance] on
>>> the Async Loggers page. I'm thinking a comparison between Logback, Log4j-1,
>>> Log4j-2.0, Log4j-2.6 "classic" and Log4j-2.6 "gc-free" would be ideal.
>>>
>>>
>>>
>>> --
>>> This message was sent by Atlassian JIRA
>>> (v6.3.4#6332)
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
>>> For additional commands, e-mail: log4j-dev-h...@logging.apache.org
>>>
>>>
>>
>>
>> --
>> [image: MagineTV]
>>
>> *Mikael Ståldal*
>> Senior software developer
>>
>> *Magine TV*
>> mikael.stal...@magine.com
>> Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   www.magine.com
>>
>> Privileged and/or Confidential Information may be contained in this
>> message. If you are not the addressee indicated in this message
>> (or responsible for delivery of the message to such a person), you may
>> not copy or deliver this message to anyone. In such case,
>> you should destroy this message and kindly notify the sender by reply
>> email.
>>
>>
>
>
> --
> [image: MagineTV]
>
> *Mikael Ståldal*
> Senior software developer
>
> *Magine TV*
> mikael.stal...@magine.com
> Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   www.magine.com
>
> Privileged and/or Confidential Information may be contained in this
> message. If you are not the addressee indicated in this message
> (or responsible for delivery of the message to such a person), you may not
> copy or deliver this message to anyone. In such case,
> you should destroy this message and kindly notify the sender by reply
> email.
>

Reply via email to