- Timestamp:
- 12/03/13 05:39:28 (8 years ago)
- Location:
- Tests/JAVA/logger
- Files:
-
- 4 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
Tests/JAVA/logger/logger.iml
r581 r582 7 7 <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> 8 8 <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> 9 <sourceFolder url="file://$MODULE_DIR$/target/generated-test-sources/test-annotations" isTestSource="true" /> 10 <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/annotations" isTestSource="false" /> 11 <excludeFolder url="file://$MODULE_DIR$/target/classes" /> 12 <excludeFolder url="file://$MODULE_DIR$/target/maven-archiver" /> 13 <excludeFolder url="file://$MODULE_DIR$/target/maven-status" /> 14 <excludeFolder url="file://$MODULE_DIR$/target/test-classes" /> 9 <excludeFolder url="file://$MODULE_DIR$/target" /> 15 10 </content> 16 11 <orderEntry type="inheritedJdk" /> … … 28 23 <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.0-beta9" level="project" /> 29 24 <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-core:2.0-beta9" level="project" /> 30 <orderEntry type="library" name="Maven: commons-cli:commons-cli:1.2" level="project" />31 <orderEntry type="library" name="Maven: org.apache.commons:commons-exec:1.1" level="project" />32 <orderEntry type="library" name="Maven: org.apache.commons:commons-math:2.1" level="project" />33 25 <orderEntry type="library" name="Maven: com.google.guava:guava:15.0" level="project" /> 34 26 <orderEntry type="library" name="Maven: org.springframework:spring-core:3.0.5.RELEASE" level="project" /> … … 36 28 <orderEntry type="library" name="Maven: org.springframework:spring-beans:3.0.5.RELEASE" level="project" /> 37 29 <orderEntry type="library" name="Maven: net.jcip:jcip-annotations:1.0" level="project" /> 38 <orderEntry type="library" name="Maven: com. googlecode.disruptor:disruptor:2.10" level="project" />30 <orderEntry type="library" name="Maven: com.lmax:disruptor:3.2.0" level="project" /> 39 31 <orderEntry type="library" name="Maven: net.java.dev.jna:jna:3.4.0" level="project" /> 40 32 <orderEntry type="library" name="Maven: org.affinity:affinity:0.1.1-SNAPSHOT" level="project" /> -
Tests/JAVA/logger/pom.xml
r581 r582 119 119 120 120 121 <!-- 121 122 <dependency> 122 123 <groupId>commons-cli</groupId> … … 134 135 <version>2.1</version> 135 136 </dependency> 137 --> 136 138 137 139 <dependency> … … 166 168 167 169 <dependency> 168 <groupId>com. googlecode.disruptor</groupId>170 <groupId>com.lmax</groupId> 169 171 <artifactId>disruptor</artifactId> 170 <version> 2.10</version>172 <version>3.2.0</version> 171 173 </dependency> 172 174 -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/BufferWriteAndDrainBenchmark.java
r581 r582 19 19 @State( Scope.Group ) 20 20 public class BufferWriteAndDrainBenchmark { 21 public static final int LENGTH = Integer.getInteger( "length", 1 <<14 );21 public static final int LENGTH_POW = Integer.getInteger( "length-pow", 14 ); 22 22 public static final int CELLS_PER_RECORD = Integer.getInteger( "cells-per-record", 8 );//8longs = 1 cache line 23 23 public static final int WRITER_BACKOFF = Integer.getInteger( "writer-backoff", 20 ); 24 24 25 public static final WaitingStrategy WAITING_STRATEGY = new WaitingStrategy.LimitedSpinning( 1024);25 public static final WaitingStrategy WAITING_STRATEGY = new WaitingStrategy.LimitedSpinning( 4048 ); 26 26 27 27 public static final AtomicInteger ID_GENERATOR = new AtomicInteger( 1 ); … … 34 34 } 35 35 }; 36 static{ 37 System.out.printf( "len=%d, record=%d, backoff=%d\n", LENGTH, CELLS_PER_RECORD, WRITER_BACKOFF ); 36 37 static { 38 System.out.printf( "len=2^%d, record=%d, backoff=%d\n", LENGTH_POW, CELLS_PER_RECORD, WRITER_BACKOFF ); 38 39 } 39 40 … … 45 46 @Setup 46 47 public void setup() { 47 buffer = new DirectAccessLongBuffer( LENGTH ); 48 sequencer = new DemultiplexingSequencer( LENGTH ); 48 final int length = 1 << LENGTH_POW; 49 buffer = new DirectAccessLongBuffer( length ); 50 sequencer = new DemultiplexingSequencer( length ); 49 51 50 52 DRAIN_AND_READ = new DemultiplexingSequencer.Drainer() { … … 104 106 @Threads( 1 ) 105 107 public void dummyDrainer() { 108 //mostly we do not care about drain latency here, measure just to be aware of it 106 109 try { 107 110 sequencer.drainTo( DRAIN_DUMMY ); 108 BlackHole.consumeCPU( 100 );111 // BlackHole.consumeCPU( 100 ); 109 112 } catch( Throwable e ) { 110 113 e.printStackTrace(); … … 127 130 @Threads( 1 ) 128 131 public void readingDrainer() { 132 //mostly we do not care about drain latency here, measure just to be aware of it 129 133 try { 130 134 sequencer.drainTo( DRAIN_AND_READ ); 131 BlackHole.consumeCPU( 100 );135 // BlackHole.consumeCPU( 100 ); 132 136 } catch( Throwable e ) { 133 137 e.printStackTrace(); … … 139 143 private void writeEntry( final int writerId, 140 144 final int cellsCount ) { 141 //TODO RC major: it needs to be timeout here, or benchmark will fail sometimes142 145 final long position = sequencer.claim( cellsCount, WAITING_STRATEGY ); 143 146 if( position < 0 ) { 147 System.err.println( "Timeout" ); 144 148 return; 145 149 } -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/IOBenchmark.java
r581 r582 13 13 * and rely on BufferedStream in case of IO, or on manually-implemented ByteBuffer 14 14 * buffering in case of NIO (while buffer size is -Dbuffer-size, default 2^14) 15 * <p/> 16 * I use single thread and re-create file on each benchmark iteration 17 * <p/> 18 * "ops" == "bytes", so ops/us -> bytes per microseconds 15 19 * 16 * I use single thread and re-create file on each benchmark iteration17 *18 * "ops" == "bytes", so ops/us -> bytes per microseconds19 20 * @author cherrus 20 21 * created 11/23/13 at 2:04 PM -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/Log4j20Benchmark.java
r581 r582 4 4 import java.util.concurrent.atomic.AtomicInteger; 5 5 6 import com.db.logger.api.impl.logger.*; 6 import com.db.logger.api.impl.logger.DemultiplexingSequencer; 7 import com.db.logger.api.impl.logger.MessageFormatterImpl; 8 import com.db.logger.api.impl.logger.WaitingStrategy; 7 9 import com.db.logger.api.impl.logger.buffer.DirectAccessLongBuffer; 8 10 import com.db.logger.api.impl.logger.buffer.ILongsBuffer; 11 import org.apache.logging.log4j.*; 12 import org.apache.logging.log4j.core.async.AsyncLogger; 13 import org.apache.logging.log4j.core.async.AsyncLoggerContext; 14 import org.apache.logging.log4j.core.config.Configuration; 15 import org.apache.logging.log4j.core.config.DefaultConfiguration; 16 import org.apache.logging.log4j.core.config.LoggerConfig; 17 import org.apache.logging.log4j.core.helpers.ClockFactory; 18 import org.apache.logging.log4j.core.helpers.CoarseCachedClock; 19 import org.apache.logging.log4j.message.MessageFactory; 20 import org.apache.logging.log4j.message.StringFormatterMessageFactory; 9 21 import org.openjdk.jmh.annotations.*; 22 import org.openjdk.jmh.annotations.Level; 10 23 import org.openjdk.jmh.logic.BlackHole; 11 24 12 25 import static com.db.logger.api.impl.logger.RecordHelper.*; 13 import static com.db.logger.api.impl.logger.WaitingStrategy.SPINNING;14 26 15 27 /** … … 20 32 @OutputTimeUnit( TimeUnit.NANOSECONDS ) 21 33 @State( Scope.Group ) 22 public class FormatterWriteAndDrainBenchmark {34 public class Log4j20Benchmark { 23 35 public static final int LENGTH = Integer.getInteger( "length", 1 << 14 ); 24 36 public static final int CELLS_PER_RECORD = Integer.getInteger( "cells-per-record", 8 );//8longs = 1 cache line 25 37 public static final int WRITER_BACKOFF = Integer.getInteger( "writer-backoff", 20 ); 26 38 27 public static final WaitingStrategy WAITING_STRATEGY = new WaitingStrategy.LimitedSpinning( 1024 );28 29 39 public static final AtomicInteger ID_GENERATOR = new AtomicInteger( 1 ); 30 40 31 public static final DemultiplexingSequencer.Drainer DRAIN_DUMMY = new DemultiplexingSequencer.Drainer() {32 @Override33 public int available( final long startSequence,34 final long sentinelSequence ) {35 return ( int ) ( sentinelSequence - startSequence );36 }37 };38 41 39 42 static { 43 System.setProperty( 44 ClockFactory.PROPERTY_NAME, 45 CoarseCachedClock.class.getName() 46 ); 40 47 System.out.printf( "len=%d, record=%d, backoff=%d\n", LENGTH, CELLS_PER_RECORD, WRITER_BACKOFF ); 41 48 } 42 49 43 public ILongsBuffer buffer;44 public DemultiplexingSequencer sequencer;45 50 46 public DemultiplexingSequencer.Drainer DRAIN_AND_READ; 51 public AsyncLoggerContext loggerContext; 52 47 53 48 54 @Setup 49 55 public void setup() { 50 buffer = new DirectAccessLongBuffer( LENGTH ); 51 sequencer = new DemultiplexingSequencer( LENGTH ); 56 loggerContext = new AsyncLoggerContext( "benchmark" ); 52 57 53 DRAIN_AND_READ = new ConsumingDrainer(); 58 54 59 } 55 60 … … 76 81 @Threads( 3 ) //actually it's (CORES-1) 77 82 public void writeFormatted( final ThreadState ts ) { 78 if( ts. formatter == null ) {83 if( ts.logger == null ) { 79 84 ts.setup( this ); 80 85 } 81 MessageFormatterImpl formatter = ts.formatter; 82 formatter = formatter.start( WAITING_STRATEGY ); 83 final int count = formatter.argumentsCount(); 84 for( int i = 0; i < count; i++ ) { 85 formatter = formatter.with( ( long ) i ); 86 } 87 formatter.submit(); 86 final AsyncLogger logger = ts.logger; 87 final Object[] arguments = new Object[CELLS_PER_RECORD - 1]; 88 logger.info( "", arguments ); 89 // final int count = formatter.argumentsCount(); 90 // for( int i = 0; i < count; i++ ) { 91 // formatter = formatter.with( ( long ) i ); 92 // } 93 // formatter.submit(); 88 94 89 95 BlackHole.consumeCPU( WRITER_BACKOFF ); … … 95 101 public void readingDrainer() { 96 102 try { 97 sequencer.drainTo( DRAIN_AND_READ );103 // sequencer.drainTo( DRAIN_AND_READ ); 98 104 // BlackHole.consumeCPU( 100 ); 99 105 } catch( Throwable e ) { … … 106 112 public final int id = ID_GENERATOR.incrementAndGet(); 107 113 108 public MessageFormatterImpl formatter;114 public AsyncLogger logger; 109 115 110 public void setup( final FormatterWriteAndDrainBenchmark b ) { 111 formatter = new MessageFormatterImpl( 116 public void setup( final Log4j20Benchmark b ) { 117 logger = new AsyncLogger( 118 b.loggerContext, 112 119 "", 113 id, 114 CELLS_PER_RECORD - 1, 115 b.buffer, 116 b.sequencer 120 StringFormatterMessageFactory.INSTANCE 117 121 ); 118 122 } … … 120 124 121 125 public static void main( final String[] args ) throws Exception { 122 final FormatterWriteAndDrainBenchmark benchmark = new FormatterWriteAndDrainBenchmark();126 final Log4j20Benchmark benchmark = new Log4j20Benchmark(); 123 127 124 128 benchmark.setup(); … … 150 154 } 151 155 152 private class ConsumingDrainer implements DemultiplexingSequencer.Drainer {153 private static final int SPINS_PER_TURN = 256;154 155 private int spinsAvailable;156 private final BlackHole hole = new BlackHole();157 158 @Override159 public int available( final long startSequence,160 final long sentinelSequence ) {161 spinsAvailable = SPINS_PER_TURN;162 for( long pos = startSequence; pos < sentinelSequence; pos++ ) {163 final long header = readHeader( pos );164 if( !isValidHeader( header ) ) {165 return ( int ) ( pos - startSequence );166 }167 final RecordHelper.RecordType type = type( header );168 final int formatId = formatId( header );169 final int argumentsCount = argumentsCount( header );170 for( int i = 1; i <= argumentsCount; i++ ) {171 hole.consume( buffer.get( pos + i ) );172 }173 buffer.put( pos, -1 );174 pos += argumentsCount;175 }176 return ( int ) ( sentinelSequence - startSequence );177 }178 179 private long readHeader( final long pos ) {180 for(; spinsAvailable >= 0; spinsAvailable-- ) {181 final long header = buffer.getVolatile( pos );182 if( isValidHeader( header ) ) {183 return header;184 }185 }186 return -1;187 }188 }189 156 }
Note: See TracChangeset
for help on using the changeset viewer.