Re: reflection? RE: async logger on slow single core env performs 50% worse than log4j v1

2013-07-30 Thread Remko Popma
It may be possible (but a bit of a hack) to use async loggers without 
reflection. It involves compiling your own version of the
com.lmax.disruptor.util.Util class where you replace the implementation of the 
#getUnsafe() method with a simple call to sun.misc.Unsafe.getUnsafe().
Obviously this is not pretty and there are no guarantees that you won#x27;t 
get a SecurityException or so next... :-(

You may be better off using AsyncAppender if you want your blocking I/O to 
happen in another thread. This may still be beneficial even on a one-core 
machine.

Back to the difference between log4j-1.2 (20% CPU) and log4j-2.0 (40% CPU).
Are the test programs identical? I remember you mentioned below that you
use MDC with 2.0 but not with 1.2. Can you give a sample of your log4j
usage with 1.2 and with 2.0? (Maybe create a JIRA and attach files to it?)

RE: reflection? RE: async logger on slow single core env performs 50% worse than log4j v1

2013-07-30 Thread SMITH, CURTIS
 Are the test programs identical? I

Yes identical excepting for log4j versions and the required totally different 
way of configuring.

 MDC

Not coded this yet, wanting to in one version or the other.  So no code to post 
since I haven't gotten to MDC vs NDC (??) yet.  Just making sure going to v2 is 
doable perf-wise.  We're short of CPU as it is in this env.   :)

Thanks for the help and opinions!

BTW since you guys know the details well,  we just need simple fish tagging, no 
location stuff, just a few context variables put into the context at event 
creation time on a thread, then all logs along that flow log 3-5 variables 
pulled from the context.  Is this doable in v1 NDC??   I would just guess a 
name-value look up by name in the PatternLayout shouldn’t' be much of a perf 
hit???

curt

-Original Message-
From: Remko Popma [mailto:rem...@yahoo.com] 
Sent: Tuesday, July 30, 2013 10:14 AM
To: Log4J-Users List
Subject: Re: reflection? RE: async logger on slow single core env performs 50% 
worse than log4j v1

It may be possible (but a bit of a hack) to use async loggers without 
reflection. It involves compiling your own version of the
com.lmax.disruptor.util.Util class where you replace the implementation of the 
#getUnsafe() method with a simple call to sun.misc.Unsafe.getUnsafe().
Obviously this is not pretty and there are no guarantees that you won#x27;t 
get a SecurityException or so next... :-(

You may be better off using AsyncAppender if you want your blocking I/O to 
happen in another thread. This may still be beneficial even on a one-core 
machine.

Back to the difference between log4j-1.2 (20% CPU) and log4j-2.0 (40% CPU).
Are the test programs identical? I remember you mentioned below that you
use MDC with 2.0 but not with 1.2. Can you give a sample of your log4j
usage with 1.2 and with 2.0? (Maybe create a JIRA and attach files to it?)


reflection? RE: async logger on slow single core env performs 50% worse than log4j v1

2013-07-29 Thread SMITH, CURTIS
Hi guys,  I mentioned this observation last week, that my embedded single core 
env, the VM also does not support reflection.  Is reflection used in the hot 
path of logging that might be affecting my testing of V2 using more CPU than v1?

 LOGGER.debug(sun.reflect.Reflection is not installed);   // 
 

I get this log at VM startup time.

Curt



package org.apache.logging.log4j.core.selector;

public class ClassLoaderContextSelector implements ContextSelector {

private static void setupCallerCheck() {
223 try {
224 final ClassLoader loader = Loader.getClassLoader();
225 final Class clazz = loader.loadClass(sun.reflect.Reflection);
226 final Method[] methods = clazz.getMethods();
227 for (final Method method : methods) {
228 final int modifier = method.getModifiers();
229 if (method.getName().equals(getCallerClass)  
Modifier.isStatic(modifier)) {
230 getCallerClass = method;
231 break;
232 }
233 }
234 } catch (final ClassNotFoundException cnfe) {
235 LOGGER.debug(sun.reflect.Reflection is not installed);   // 

236 

-Original Message-
From: Remko Popma [mailto:rem...@yahoo.com] 
Sent: Saturday, July 27, 2013 5:40 AM
To: Log4J Users List; Remko Popma
Subject: Re: async logger on slow single core env performs 50% worse than log4j 
v1

I quickly reviewed the code and as far as I can tell:
* only the following places in Log4j-2 will create a permanent thread in 
addition to your application threads: AsyncLoggers, AsyncAppenders, 
o.a.l.l.c.net.SocketServer, o.a.l.l.c.net.UDPSocketServer and 
o.a.l.l.c.helpers.*CachedClock
* synchronous logging will not create any threads
* RollingFile creates a short-lived thread for the roll-over, *only* if the old 
file needs to be compressed to a .zip or .gz file (the file rename action is 
synchronous)

So I'm thinking that the difference in CPU usage is caused by something other 
than threads or async logging.
I'd be interested in your answers to my questions below.

Best regards,
Remko



 From: Remko Popma rem...@yahoo.com
To: Log4J Users List log4j-user@logging.apache.org 
Sent: Saturday, July 27, 2013 12:53 PM
Subject: Re: async logger on slow single core env performs 50% worse than log4j 
v1
 

I don't think we've ever done any performance testing on the kind of 
environment you describe, so this is great feedback, thanks!

First, configuration via XML instead of sys props is on the todo list.

Second, you mentioned you use system property AsyncLoggerContextSelector to 
switch on AsyncLoggers.
This is incorrect. The correct key is Log4jContextSelector (and that would 
explain why removing this setting made no difference).

Third, if I understand correctly you are essentially logging to a memory-mapped 
file. In that case any buffering is just wasting CPU resources, so you should 
not use the Fast*File appenders as their buffering cannot be switched off. 
(Non-Fast) FileAppenders also use bufferedIO=true by default, but you can 
switch this off in config. I would expect this to save some CPU.

On that note, you mentioned CPU usage as your performance measure. Is that the 
most important number? Do you have any throughput/latency goals?
Do you have any tools on your platform to see what the CPU is doing? Which 
threads are busy for example?

In terms of GC, making all loggers Async has a small benefit in that it re-uses 
log event objects.


I am still intrigued by the difference in CPU usage you mention between 
log4j-1.2 and 2.0. Is your application code exactly the same? Or do you use the 
pattern formats that are now available in log4j-2.0?

Regards,
Remko



From: SMITH, CURTIS cs0...@att.com
To: Log4J Users List log4j-user@logging.apache.org 
Sent: Saturday, July 27, 2013 6:55 AM
Subject: RE: async logger on slow single core env performs 50% worse than log4j 
v1


LOL well that's obvious now.  :)  It was more a case of wishful thinking and 
why not give it a try.    But it's still odd that my attempts to slim it down 
It's still 2x worse than v1.  Something else is in play.

curt

-Original Message-
From: Ralph Goers [mailto:ralph.go...@dslextreme.com] 
Sent: Friday, July 26, 2013 5:34 PM
To: Log4J Users List
Subject: Re: async logger on slow single core env performs 50% worse than log4j 
v1

I'm curious why you are even trying to use Async anything with a single core 
environment (unless it is hyper-threaded). Only 1 thread can be active at a 
time so when you switch threads the active thread will just stop. This won't 
gain you any additional throughput but you will still incur the additional 
overhead of thread management and locking.

Ralph

On Jul 26, 2013, at 1:55 PM, SMITH, CURTIS wrote:

 I removed  

Re: reflection? RE: async logger on slow single core env performs 50% worse than log4j v1

2013-07-29 Thread Ralph Goers
In your environment I would definitely recommend using BasicContextSelector as 
you are unlikely to have need for multiple LoggerContexts.

Ralph

On Jul 29, 2013, at 7:08 AM, SMITH, CURTIS wrote:

 Hi guys,  I mentioned this observation last week, that my embedded single 
 core env, the VM also does not support reflection.  Is reflection used in the 
 hot path of logging that might be affecting my testing of V2 using more CPU 
 than v1?
 
 LOGGER.debug(sun.reflect.Reflection is not installed);   // 
 ï∞ƒ
 
 I get this log at VM startup time.
 
 Curt
 
 
 
 package org.apache.logging.log4j.core.selector;
 
 public class ClassLoaderContextSelector implements ContextSelector {
 
 private static void setupCallerCheck() {
 223 try {
 224 final ClassLoader loader = Loader.getClassLoader();
 225 final Class clazz = 
 loader.loadClass(sun.reflect.Reflection);
 226 final Method[] methods = clazz.getMethods();
 227 for (final Method method : methods) {
 228 final int modifier = method.getModifiers();
 229 if (method.getName().equals(getCallerClass)  
 Modifier.isStatic(modifier)) {
 230 getCallerClass = method;
 231 break;
 232 }
 233 }
 234 } catch (final ClassNotFoundException cnfe) {
 235 LOGGER.debug(sun.reflect.Reflection is not installed);   // 
 ï∞ƒ
 236 
 
 -Original Message-
 From: Remko Popma [mailto:rem...@yahoo.com] 
 Sent: Saturday, July 27, 2013 5:40 AM
 To: Log4J Users List; Remko Popma
 Subject: Re: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 I quickly reviewed the code and as far as I can tell:
 * only the following places in Log4j-2 will create a permanent thread in 
 addition to your application threads:Â AsyncLoggers, AsyncAppenders, 
 o.a.l.l.c.net.SocketServer, o.a.l.l.c.net.UDPSocketServer and 
 o.a.l.l.c.helpers.*CachedClock
 * synchronous logging will not create any threads
 * RollingFile creates a short-lived thread for the roll-over, *only*Â if the 
 old file needs to be compressed to a .zip or .gz file (the file rename action 
 is synchronous)
 
 So I'm thinking that the difference in CPU usage is caused by something other 
 than threads or async logging.
 I'd be interested in your answers to my questions below.
 
 Best regards,
 Remko
 
 
 
 From: Remko Popma rem...@yahoo.com
 To: Log4J Users List log4j-user@logging.apache.org 
 Sent: Saturday, July 27, 2013 12:53 PM
 Subject: Re: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 
 I don't think we've ever done any performance testing on the kind of 
 environment you describe, so this is great feedback, thanks!
 
 First, configuration via XML instead of sys props is on the todo list.
 
 Second, you mentioned you use system property AsyncLoggerContextSelector to 
 switch on AsyncLoggers.
 This is incorrect. The correct key is Log4jContextSelector (and that would 
 explain why removing this setting made no difference).
 
 Third, if I understand correctly you are essentially logging to a 
 memory-mapped file. In that case any buffering is just wasting CPU resources, 
 so you should not use the Fast*File appenders as their buffering cannot be 
 switched off. (Non-Fast) FileAppenders also use bufferedIO=true by default, 
 but you can switch this off in config. I would expect this to save some CPU.
 
 On that note, you mentioned CPU usage as your performance measure. Is that 
 the most important number? Do you have any throughput/latency goals?
 Do you have any tools on your platform to see what the CPU is doing? Which 
 threads are busy for example?
 
 In terms of GC, making all loggers Async has a small benefit in that it 
 re-uses log event objects.
 
 
 I am still intrigued by the difference in CPU usage you mention between 
 log4j-1.2 and 2.0. Is your application code exactly the same? Or do you use 
 the pattern formats that are now available in log4j-2.0?
 
 Regards,
 Remko
 
 
 
 From: SMITH, CURTIS cs0...@att.com
 To: Log4J Users List log4j-user@logging.apache.org 
 Sent: Saturday, July 27, 2013 6:55 AM
 Subject: RE: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 
 LOL well that's obvious now.  :)  It was more a case of wishful thinking 
 and why not give it a try.    But it's still odd that my attempts to slim 
 it down It's still 2x worse than v1.  Something else is in play.
 
 curt
 
 -Original Message-
 From: Ralph Goers [mailto:ralph.go...@dslextreme.com] 
 Sent: Friday, July 26, 2013 5:34 PM
 To: Log4J Users List
 Subject: Re: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 I'm curious why you are even trying to use Async anything with a single core 
 environment (unless it 

Re: reflection? RE: async logger on slow single core env performs 50% worse than log4j v1

2013-07-29 Thread Ralph Goers
This probably warrants an enhancement to Log4jContextFactory. I can imagine 
other use cases where defaulting to BasicContextSelector also makes sense.

Ralph

On Jul 29, 2013, at 8:02 AM, Ralph Goers wrote:

 In your environment I would definitely recommend using BasicContextSelector 
 as you are unlikely to have need for multiple LoggerContexts.
 
 Ralph
 
 On Jul 29, 2013, at 7:08 AM, SMITH, CURTIS wrote:
 
 Hi guys,  I mentioned this observation last week, that my embedded single 
 core env, the VM also does not support reflection.  Is reflection used in 
 the hot path of logging that might be affecting my testing of V2 using more 
 CPU than v1?
 
 LOGGER.debug(sun.reflect.Reflection is not installed);   // 
 ï∞ƒ
 
 I get this log at VM startup time.
 
 Curt
 
 
 
 package org.apache.logging.log4j.core.selector;
 
 public class ClassLoaderContextSelector implements ContextSelector {
 
 private static void setupCallerCheck() {
 223 try {
 224 final ClassLoader loader = Loader.getClassLoader();
 225 final Class clazz = 
 loader.loadClass(sun.reflect.Reflection);
 226 final Method[] methods = clazz.getMethods();
 227 for (final Method method : methods) {
 228 final int modifier = method.getModifiers();
 229 if (method.getName().equals(getCallerClass)  
 Modifier.isStatic(modifier)) {
 230 getCallerClass = method;
 231 break;
 232 }
 233 }
 234 } catch (final ClassNotFoundException cnfe) {
 235 LOGGER.debug(sun.reflect.Reflection is not installed);   
 // ï∞ƒ
 236 
 
 -Original Message-
 From: Remko Popma [mailto:rem...@yahoo.com] 
 Sent: Saturday, July 27, 2013 5:40 AM
 To: Log4J Users List; Remko Popma
 Subject: Re: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 I quickly reviewed the code and as far as I can tell:
 * only the following places in Log4j-2 will create a permanent thread in 
 addition to your application threads:Â AsyncLoggers, AsyncAppenders, 
 o.a.l.l.c.net.SocketServer, o.a.l.l.c.net.UDPSocketServer and 
 o.a.l.l.c.helpers.*CachedClock
 * synchronous logging will not create any threads
 * RollingFile creates a short-lived thread for the roll-over, *only*Â if the 
 old file needs to be compressed to a .zip or .gz file (the file rename 
 action is synchronous)
 
 So I'm thinking that the difference in CPU usage is caused by something 
 other than threads or async logging.
 I'd be interested in your answers to my questions below.
 
 Best regards,
 Remko
 
 
 
 From: Remko Popma rem...@yahoo.com
 To: Log4J Users List log4j-user@logging.apache.org 
 Sent: Saturday, July 27, 2013 12:53 PM
 Subject: Re: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 
 I don't think we've ever done any performance testing on the kind of 
 environment you describe, so this is great feedback, thanks!
 
 First, configuration via XML instead of sys props is on the todo list.
 
 Second, you mentioned you use system property AsyncLoggerContextSelector 
 to switch on AsyncLoggers.
 This is incorrect. The correct key is Log4jContextSelector (and that would 
 explain why removing this setting made no difference).
 
 Third, if I understand correctly you are essentially logging to a 
 memory-mapped file. In that case any buffering is just wasting CPU 
 resources, so you should not use the Fast*File appenders as their buffering 
 cannot be switched off. (Non-Fast) FileAppenders also use bufferedIO=true by 
 default, but you can switch this off in config. I would expect this to save 
 some CPU.
 
 On that note, you mentioned CPU usage as your performance measure. Is that 
 the most important number? Do you have any throughput/latency goals?
 Do you have any tools on your platform to see what the CPU is doing? Which 
 threads are busy for example?
 
 In terms of GC, making all loggers Async has a small benefit in that it 
 re-uses log event objects.
 
 
 I am still intrigued by the difference in CPU usage you mention between 
 log4j-1.2 and 2.0. Is your application code exactly the same? Or do you use 
 the pattern formats that are now available in log4j-2.0?
 
 Regards,
 Remko
 
 
 
 From: SMITH, CURTIS cs0...@att.com
 To: Log4J Users List log4j-user@logging.apache.org 
 Sent: Saturday, July 27, 2013 6:55 AM
 Subject: RE: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 
 LOL well that's obvious now.  :)  It was more a case of wishful thinking 
 and why not give it a try.    But it's still odd that my attempts to 
 slim it down It's still 2x worse than v1.  Something else is in play.
 
 curt
 
 -Original Message-
 From: Ralph Goers [mailto:ralph.go...@dslextreme.com] 
 Sent: Friday, July 26, 2013 

RE: reflection? RE: async logger on slow single core env performs 50% worse than log4j v1

2013-07-29 Thread SMITH, CURTIS
.run(Util.java:102)
at com.lmax.disruptor.util.Util$1.run(Util.java:99)
at 
java.security.AccessController.doPrivileged(AccessController.java:255)
... 40 more










-Original Message-
From: Ralph Goers [mailto:ralph.go...@dslextreme.com] 
Sent: Monday, July 29, 2013 11:05 AM
To: Log4J Users List
Subject: Re: reflection? RE: async logger on slow single core env performs 50% 
worse than log4j v1

This probably warrants an enhancement to Log4jContextFactory. I can imagine 
other use cases where defaulting to BasicContextSelector also makes sense.

Ralph

On Jul 29, 2013, at 8:02 AM, Ralph Goers wrote:

 In your environment I would definitely recommend using BasicContextSelector 
 as you are unlikely to have need for multiple LoggerContexts.
 
 Ralph
 
 On Jul 29, 2013, at 7:08 AM, SMITH, CURTIS wrote:
 
 Hi guys,  I mentioned this observation last week, that my embedded single 
 core env, the VM also does not support reflection.  Is reflection used in 
 the hot path of logging that might be affecting my testing of V2 using more 
 CPU than v1?
 
 LOGGER.debug(sun.reflect.Reflection is not installed);   // 
 ï∞ƒ
 
 I get this log at VM startup time.
 
 Curt
 
 
 
 package org.apache.logging.log4j.core.selector;
 
 public class ClassLoaderContextSelector implements ContextSelector {
 
 private static void setupCallerCheck() {
 223 try {
 224 final ClassLoader loader = Loader.getClassLoader();
 225 final Class clazz = 
 loader.loadClass(sun.reflect.Reflection);
 226 final Method[] methods = clazz.getMethods();
 227 for (final Method method : methods) {
 228 final int modifier = method.getModifiers();
 229 if (method.getName().equals(getCallerClass)  
 Modifier.isStatic(modifier)) {
 230 getCallerClass = method;
 231 break;
 232 }
 233 }
 234 } catch (final ClassNotFoundException cnfe) {
 235 LOGGER.debug(sun.reflect.Reflection is not installed);   
 // ï∞ƒ
 236 
 
 -Original Message-
 From: Remko Popma [mailto:rem...@yahoo.com] 
 Sent: Saturday, July 27, 2013 5:40 AM
 To: Log4J Users List; Remko Popma
 Subject: Re: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 I quickly reviewed the code and as far as I can tell:
 * only the following places in Log4j-2 will create a permanent thread in 
 addition to your application threads:Â AsyncLoggers, AsyncAppenders, 
 o.a.l.l.c.net.SocketServer, o.a.l.l.c.net.UDPSocketServer and 
 o.a.l.l.c.helpers.*CachedClock
 * synchronous logging will not create any threads
 * RollingFile creates a short-lived thread for the roll-over, *only*Â if the 
 old file needs to be compressed to a .zip or .gz file (the file rename 
 action is synchronous)
 
 So I'm thinking that the difference in CPU usage is caused by something 
 other than threads or async logging.
 I'd be interested in your answers to my questions below.
 
 Best regards,
 Remko
 
 
 
 From: Remko Popma rem...@yahoo.com
 To: Log4J Users List log4j-user@logging.apache.org 
 Sent: Saturday, July 27, 2013 12:53 PM
 Subject: Re: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 
 I don't think we've ever done any performance testing on the kind of 
 environment you describe, so this is great feedback, thanks!
 
 First, configuration via XML instead of sys props is on the todo list.
 
 Second, you mentioned you use system property AsyncLoggerContextSelector 
 to switch on AsyncLoggers.
 This is incorrect. The correct key is Log4jContextSelector (and that would 
 explain why removing this setting made no difference).
 
 Third, if I understand correctly you are essentially logging to a 
 memory-mapped file. In that case any buffering is just wasting CPU 
 resources, so you should not use the Fast*File appenders as their buffering 
 cannot be switched off. (Non-Fast) FileAppenders also use bufferedIO=true by 
 default, but you can switch this off in config. I would expect this to save 
 some CPU.
 
 On that note, you mentioned CPU usage as your performance measure. Is that 
 the most important number? Do you have any throughput/latency goals?
 Do you have any tools on your platform to see what the CPU is doing? Which 
 threads are busy for example?
 
 In terms of GC, making all loggers Async has a small benefit in that it 
 re-uses log event objects.
 
 
 I am still intrigued by the difference in CPU usage you mention between 
 log4j-1.2 and 2.0. Is your application code exactly the same? Or do you use 
 the pattern formats that are now available in log4j-2.0?
 
 Regards,
 Remko
 
 
 
 From: SMITH, CURTIS cs0...@att.com
 To: Log4J Users List log4j-user@logging.apache.org 
 Sent: Saturday, July 27, 2013 6:55 AM

Re: reflection? RE: async logger on slow single core env performs 50% worse than log4j v1

2013-07-29 Thread Ralph Goers
: theUnsafe
at 
 java.security.AccessController.doPrivileged(AccessController.java:259)
at com.lmax.disruptor.util.Util.clinit(Util.java:108)
... 39 more
 Caused by: java.lang.NoSuchFieldException: theUnsafe
at java.lang.Class.getDeclaredFieldImpl(Native Method)
at java.lang.Class.getDeclaredField(Class.java:487)
at com.lmax.disruptor.util.Util$1.run(Util.java:102)
at com.lmax.disruptor.util.Util$1.run(Util.java:99)
at 
 java.security.AccessController.doPrivileged(AccessController.java:255)
... 40 more
 
 
 
 
 
 
 
 
 
 
 -Original Message-
 From: Ralph Goers [mailto:ralph.go...@dslextreme.com] 
 Sent: Monday, July 29, 2013 11:05 AM
 To: Log4J Users List
 Subject: Re: reflection? RE: async logger on slow single core env performs 
 50% worse than log4j v1
 
 This probably warrants an enhancement to Log4jContextFactory. I can imagine 
 other use cases where defaulting to BasicContextSelector also makes sense.
 
 Ralph
 
 On Jul 29, 2013, at 8:02 AM, Ralph Goers wrote:
 
 In your environment I would definitely recommend using BasicContextSelector 
 as you are unlikely to have need for multiple LoggerContexts.
 
 Ralph
 
 On Jul 29, 2013, at 7:08 AM, SMITH, CURTIS wrote:
 
 Hi guys,  I mentioned this observation last week, that my embedded single 
 core env, the VM also does not support reflection.  Is reflection used in 
 the hot path of logging that might be affecting my testing of V2 using more 
 CPU than v1?
 
 LOGGER.debug(sun.reflect.Reflection is not installed);   // 
 ïâ√ıÆ‚
 
 I get this log at VM startup time.
 
 Curt
 
 
 
 package org.apache.logging.log4j.core.selector;
 
 public class ClassLoaderContextSelector implements ContextSelector {
 
 private static void setupCallerCheck() {
 223 try {
 224 final ClassLoader loader = Loader.getClassLoader();
 225 final Class clazz = 
 loader.loadClass(sun.reflect.Reflection);
 226 final Method[] methods = clazz.getMethods();
 227 for (final Method method : methods) {
 228 final int modifier = method.getModifiers();
 229 if (method.getName().equals(getCallerClass)  
 Modifier.isStatic(modifier)) {
 230 getCallerClass = method;
 231 break;
 232 }
 233 }
 234 } catch (final ClassNotFoundException cnfe) {
 235 LOGGER.debug(sun.reflect.Reflection is not installed);   
 // ïâ√ıÆ‚
 236 
 
 -Original Message-
 From: Remko Popma [mailto:rem...@yahoo.com] 
 Sent: Saturday, July 27, 2013 5:40 AM
 To: Log4J Users List; Remko Popma
 Subject: Re: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 I quickly reviewed the code and as far as I can tell:
 * only the following places in Log4j-2 will create a permanent thread in 
 addition to your application threads:̭ AsyncLoggers, AsyncAppenders, 
 o.a.l.l.c.net.SocketServer,̭ o.a.l.l.c.net.UDPSocketServer anḓ 
 o.a.l.l.c.helpers.*CachedClock
 * synchronous logging will not create any threads
 * RollingFile creates a short-lived thread for the roll-over, *only*̭ if 
 the old file needs to be compressed to a .zip or .gz file (the file rename 
 action is synchronous)
 
 So I'm thinking that the difference in CPU usage is caused by something 
 other than threads or async logging.
 I'd be interested in your answers to my questions below.
 
 Best regards,
 Remko
 
 
 
 From: Remko Popma rem...@yahoo.com
 To: Log4J Users List log4j-user@logging.apache.org 
 Sent: Saturday, July 27, 2013 12:53 PM
 Subject: Re: async logger on slow single core env performs 50% worse than 
 log4j v1
 
 
 I don't think we've ever done any performance testing on the kind of 
 environment you describe, so this is great feedback, thanks!
 
 First, configuration via XML instead of sys props is on the todo list.
 
 Second, you mentioned you use system property AsyncLoggerContextSelector 
 to switch on AsyncLoggers.
 This is incorrect. The correct key is Log4jContextSelector (and that 
 would explain why removing this setting made no difference).
 
 Third, if I understand correctly you are essentially logging to a 
 memory-mapped file. In that case any buffering is just wasting CPU 
 resources, so you should not use the Fast*File appenders as their buffering 
 cannot be switched off. (Non-Fast) FileAppenders also use bufferedIO=true 
 by default, but you can switch this off in config. I would expect this to 
 save some CPU.
 
 On that note, you mentioned CPU usage as your performance measure. Is that 
 the most important number? Do you have any throughput/latency goals?
 Do you have any tools on your platform to see what the CPU is doing? Which 
 threads are busy for example?
 
 In terms of GC, making all loggers Async has a small benefit

RE: reflection? RE: async logger on slow single core env performs 50% worse than log4j v1

2013-07-29 Thread SMITH, CURTIS
Hi Ralph, my exception is from the disruptor jar apparently using reflection 
(below).  How is that related to the ClassLoaderContextSelector?

I would have guessed that the BasicContextSelector is default???   I'm not 
setting Log4jContextSelector so it has to be using some context, wouldn't the 
default be the simplest?


Is there benefit from me setting:  Log4jContextSelector to 
org.apache.logging.log4j.core.selector.BasicContextSelector.

FWIW I'm having to give up on async logger because my VM doesn't support 
reflection, and unless I'm not understanding this new architecture, this 
exception says I'm locked out from testing async logger without reflection.

Tnx curt

-Original Message-
From: Ralph Goers [mailto:ralph.go...@dslextreme.com] 
Sent: Monday, July 29, 2013 2:15 PM
To: Log4J Users List
Subject: Re: reflection? RE: async logger on slow single core env performs 50% 
worse than log4j v1

Yes.  ClassLoaderContextSelector is complicated and probably not at all what 
you want. it uses the Sun reflection class, which you've noticed is not 
installed, and runs slower without it. I don't think ClassLoaderContextSelector 
will be of any benefit to you over BasicContextSelector.


On Jul 29, 2013, at 9:05 AM, SMITH, CURTIS wrote:

 Ralph,  Was your comment about BasicContextSelector me and my quest to get V2 
 to run as well as V1 on my slow single core J2ME env?
 
 My test run with AsyncLogger blew up.  This J2ME VM does not have reflection. 
  Guessing that disruptor uses reflection to cast methods/objects (bottom).
 
 This leaves me with just one more experiment to get V2 to perform as well as 
 V1:  RollingFile with bufferedIO=false
 
 RE: MDC, no we'll not use any location info, just passing values like 
 username (example) and similar  constant values from each transaction 
 initiation into the log.  
 
 
 #0   ERRORError occurred while trying to activate bundle!
 java.lang.ExceptionInInitializerError
at java.lang.J9VMInternals.initialize(J9VMInternals.java:233)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1279)
at 
 com.prosyst.mbs.impl.framework.BundleImpl.startIt(BundleImpl.java:4287)
at 
 com.prosyst.mbs.impl.framework.BundleImpl.simpleStart(BundleImpl.java:1744)
at 
 com.prosyst.mbs.impl.framework.BundleImpl.start0(BundleImpl.java:1642)
at 
 com.prosyst.mbs.impl.framework.BundleImpl.start0(BundleImpl.java:1515)
at 
 com.prosyst.mbs.impl.framework.BundleImpl.start(BundleImpl.java:1350)
at 
 com.prosyst.mbs.impl.framework.BundleImpl.start(BundleImpl.java:1060)
at 
 com.prosyst.mbs.impl.framework.module.boot.BootImpl.start(BootImpl.java:869)
at 
 com.prosyst.mbs.impl.framework.module.boot.BootImpl.executeBoot(BootImpl.java:386)
at 
 com.prosyst.mbs.impl.framework.module.boot.BootImpl.processDefaultBoot(BootImpl.java:163)
at 
 com.prosyst.mbs.impl.framework.module.boot.BootImpl.start(BootImpl.java:93)
at 
 com.prosyst.mbs.impl.framework.FrameworkLauncher.start(FrameworkLauncher.java:1194)
at 
 com.prosyst.mbs.impl.framework.FrameworkLauncher.finishLaunch(FrameworkLauncher.java:501)
at 
 com.prosyst.mbs.impl.framework.FrameworkLauncher.launch(FrameworkLauncher.java:476)
at 
 java.lang.reflect.AccessibleObject.invokeV(AccessibleObject.java:195)
at java.lang.reflect.Method.invoke(Method.java:242)
at 
 com.prosyst.mbs.impl.framework.Start.processFrameworkLaunch(Start.java:196)
at com.prosyst.mbs.impl.framework.Start.main(Start.java:82)
 Caused by: java.lang.IllegalStateException: Unexpected error building Logger: 
 null
at com.att.dlc.logging.LoggerFactory.buildLogger(LoggerFactory.java:92)
at com.att.dlc.logging.LoggerFactory.getLogger(LoggerFactory.java:34)
at com.att.dlc.osgi.Activator.clinit(Activator.java:120)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:211)
... 19 more
 Caused by: java.lang.reflect.InvocationTargetException
at 
 java.lang.reflect.AccessibleObject.invokeV(AccessibleObject.java:197)
at java.lang.reflect.Constructor.newInstance(Constructor.java:204)
at com.att.dlc.logging.LoggerFactory.buildLogger(LoggerFactory.java:89)
... 23 more
 Caused by: java.lang.ExceptionInInitializerError
at java.lang.J9VMInternals.initialize(J9VMInternals.java:233)
at 
 org.apache.logging.log4j.core.async.AsyncLogger.calculateRingBufferSize(AsyncLogger.java:123)
at 
 org.apache.logging.log4j.core.async.AsyncLogger.clinit(AsyncLogger.java:89)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:211)
at 
 org.apache.logging.log4j.core.async.AsyncLoggerContext.newInstance(AsyncLoggerContext.java:51

Re: reflection? RE: async logger on slow single core env performs 50% worse than log4j v1

2013-07-29 Thread Ralph Goers
The exception with the Disruptor wouldn't be. It basically means you cannot use 
the Async Loggers. The benefit to using the BasicContextSelector is that it is 
lighter weight and you won't get the warning about the Sun Reflection class 
being missing.]

I have not tested with J2ME so I can't really say what will work and what won't.

Ralph

On Jul 29, 2013, at 2:40 PM, SMITH, CURTIS wrote:

 Hi Ralph, my exception is from the disruptor jar apparently using reflection 
 (below).  How is that related to the ClassLoaderContextSelector?
 
 I would have guessed that the BasicContextSelector is default???   I'm not 
 setting Log4jContextSelector so it has to be using some context, wouldn't the 
 default be the simplest?
 
 
 Is there benefit from me setting:  Log4jContextSelector to 
 org.apache.logging.log4j.core.selector.BasicContextSelector.
 
 FWIW I'm having to give up on async logger because my VM doesn't support 
 reflection, and unless I'm not understanding this new architecture, this 
 exception says I'm locked out from testing async logger without reflection.
 
 Tnx curt
 
 -Original Message-
 From: Ralph Goers [mailto:ralph.go...@dslextreme.com] 
 Sent: Monday, July 29, 2013 2:15 PM
 To: Log4J Users List
 Subject: Re: reflection? RE: async logger on slow single core env performs 
 50% worse than log4j v1
 
 Yes.  ClassLoaderContextSelector is complicated and probably not at all what 
 you want. it uses the Sun reflection class, which you've noticed is not 
 installed, and runs slower without it. I don't think 
 ClassLoaderContextSelector will be of any benefit to you over 
 BasicContextSelector.
 
 
 On Jul 29, 2013, at 9:05 AM, SMITH, CURTIS wrote:
 
 Ralph,  Was your comment about BasicContextSelector me and my quest to get 
 V2 to run as well as V1 on my slow single core J2ME env?
 
 My test run with AsyncLogger blew up.  This J2ME VM does not have 
 reflection.  Guessing that disruptor uses reflection to cast methods/objects 
 (bottom).
 
 This leaves me with just one more experiment to get V2 to perform as well as 
 V1:  RollingFile with bufferedIO=false
 
 RE: MDC, no we'll not use any location info, just passing values like 
 username (example) and similar  constant values from each transaction 
 initiation into the log.  
 
 
 #0   ERRORError occurred while trying to activate bundle!
 java.lang.ExceptionInInitializerError
   at java.lang.J9VMInternals.initialize(J9VMInternals.java:233)
   at java.lang.Class.newInstanceImpl(Native Method)
   at java.lang.Class.newInstance(Class.java:1279)
   at 
 com.prosyst.mbs.impl.framework.BundleImpl.startIt(BundleImpl.java:4287)
   at 
 com.prosyst.mbs.impl.framework.BundleImpl.simpleStart(BundleImpl.java:1744)
   at 
 com.prosyst.mbs.impl.framework.BundleImpl.start0(BundleImpl.java:1642)
   at 
 com.prosyst.mbs.impl.framework.BundleImpl.start0(BundleImpl.java:1515)
   at 
 com.prosyst.mbs.impl.framework.BundleImpl.start(BundleImpl.java:1350)
   at 
 com.prosyst.mbs.impl.framework.BundleImpl.start(BundleImpl.java:1060)
   at 
 com.prosyst.mbs.impl.framework.module.boot.BootImpl.start(BootImpl.java:869)
   at 
 com.prosyst.mbs.impl.framework.module.boot.BootImpl.executeBoot(BootImpl.java:386)
   at 
 com.prosyst.mbs.impl.framework.module.boot.BootImpl.processDefaultBoot(BootImpl.java:163)
   at 
 com.prosyst.mbs.impl.framework.module.boot.BootImpl.start(BootImpl.java:93)
   at 
 com.prosyst.mbs.impl.framework.FrameworkLauncher.start(FrameworkLauncher.java:1194)
   at 
 com.prosyst.mbs.impl.framework.FrameworkLauncher.finishLaunch(FrameworkLauncher.java:501)
   at 
 com.prosyst.mbs.impl.framework.FrameworkLauncher.launch(FrameworkLauncher.java:476)
   at 
 java.lang.reflect.AccessibleObject.invokeV(AccessibleObject.java:195)
   at java.lang.reflect.Method.invoke(Method.java:242)
   at 
 com.prosyst.mbs.impl.framework.Start.processFrameworkLaunch(Start.java:196)
   at com.prosyst.mbs.impl.framework.Start.main(Start.java:82)
 Caused by: java.lang.IllegalStateException: Unexpected error building 
 Logger: null
   at com.att.dlc.logging.LoggerFactory.buildLogger(LoggerFactory.java:92)
   at com.att.dlc.logging.LoggerFactory.getLogger(LoggerFactory.java:34)
   at com.att.dlc.osgi.Activator.clinit(Activator.java:120)
   at java.lang.J9VMInternals.initializeImpl(Native Method)
   at java.lang.J9VMInternals.initialize(J9VMInternals.java:211)
   ... 19 more
 Caused by: java.lang.reflect.InvocationTargetException
   at 
 java.lang.reflect.AccessibleObject.invokeV(AccessibleObject.java:197)
   at java.lang.reflect.Constructor.newInstance(Constructor.java:204)
   at com.att.dlc.logging.LoggerFactory.buildLogger(LoggerFactory.java:89)
   ... 23 more
 Caused by: java.lang.ExceptionInInitializerError
   at java.lang.J9VMInternals.initialize(J9VMInternals.java:233