Search in sources :

Example 31 with Wire

use of net.openhft.chronicle.wire.Wire in project Chronicle-Queue by OpenHFT.

the class LatencyDistributionMain method runTest.

protected void runTest(@NotNull ChronicleQueue queue, @NotNull ChronicleQueue queue2) throws InterruptedException {
    Histogram histogramCo = new Histogram();
    Histogram histogramIn = new Histogram();
    Histogram histogramWr = new Histogram();
    Thread pretoucher = new Thread(() -> {
        ExcerptAppender appender = queue.acquireAppender();
        try {
            while (!Thread.currentThread().isInterrupted()) {
                appender.pretouch();
                Jvm.pause(50);
            }
        } catch (Exception e) {
            if (!appender.isClosed())
                e.printStackTrace();
        }
    });
    pretoucher.setDaemon(true);
    pretoucher.start();
    ExcerptAppender appender = queue.acquireAppender();
    // two queues as most like in a different process.
    ExcerptTailer tailer = queue2.createTailer();
    String name = getClass().getName();
    Thread tailerThread = new Thread(() -> {
        AffinityLock lock = null;
        try {
            if (Jvm.getBoolean("enableTailerAffinity") || !Jvm.getBoolean("disableAffinity")) {
                lock = Affinity.acquireLock();
            }
            int counter = 0;
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    // if (SAMPLING)
                    // sampler.thread(Thread.currentThread());
                    // boolean found = tailer.readDocument(myReadMarshallable);
                    boolean found;
                    try (DocumentContext dc = tailer.readingDocument()) {
                        found = dc.isPresent();
                        if (found) {
                            int count = counter++;
                            if (count == WARMUP) {
                                histogramCo.reset();
                                histogramIn.reset();
                                histogramWr.reset();
                            }
                            Bytes<?> bytes = dc.wire().bytes();
                            long startCo = bytes.readLong();
                            long startIn = bytes.readLong();
                            long now = System.nanoTime();
                            histogramCo.sample(now - startCo);
                            histogramIn.sample(now - startIn);
                            if (count % INTLOG_INTERVAL == 0)
                                System.out.println("read  " + count);
                        }
                    }
                /*
                        if (SAMPLING) {
                            StackTraceElement[] stack = sampler.getAndReset();
                            if (stack != null) {
                                if (!stack[0].getClassName().equals(name) &&
                                        !stack[0].getClassName().equals("java.lang.Thread")) {
                                    StringBuilder sb = new StringBuilder();
                                    Jvm.trimStackTrace(sb, stack);
                                   // System.out.println(sb);
                                }
                            } else if (!found) {
                                Thread.yield();
                            }
                        }
                        */
                } catch (Exception e) {
                    break;
                }
            }
        } finally {
            if (lock != null) {
                lock.release();
            }
        }
    });
    Thread appenderThread = new Thread(() -> {
        AffinityLock lock = null;
        try {
            if (Jvm.getBoolean("enableAppenderAffinity") || !Jvm.getBoolean("disableAffinity")) {
                lock = Affinity.acquireLock();
            }
            long next = System.nanoTime();
            long interval = 1_000_000_000 / throughput;
            Map<String, Integer> stackCount = new LinkedHashMap<>();
            BytesStore<?, ?> bytes24 = BytesStore.nativeStoreFrom(new byte[Main.size - 16]);
            for (int i = -WARMUP; i < iterations; i++) {
                long s0 = System.nanoTime();
                if (s0 < next) {
                    do ; while (System.nanoTime() < next);
                    // if we failed to come out of the spin loop on time, reset next.
                    next = System.nanoTime();
                }
                if (SAMPLING) {
                    sampler.thread(Thread.currentThread());
                }
                long start = System.nanoTime();
                try (@NotNull DocumentContext dc = appender.writingDocument(false)) {
                    Wire wire = dc.wire();
                    Bytes<?> bytes2 = wire.bytes();
                    // when it should have started
                    bytes2.writeLong(next);
                    // when it actually started.
                    bytes2.writeLong(start);
                    bytes2.write(bytes24);
                    ThroughputMain.addToEndOfCache(wire);
                }
                long time = System.nanoTime() - start;
                histogramWr.sample(start - next);
                if (SAMPLING && time > 1e3 && i > 0) {
                    StackTraceElement[] stack = sampler.getAndReset();
                    if (stack != null) {
                        if (!stack[0].getClassName().equals(name) && !stack[0].getClassName().equals("java.lang.Thread")) {
                            StringBuilder sb = new StringBuilder();
                            Jvm.trimStackTrace(sb, stack);
                            stackCount.compute(sb.toString(), (k, v) -> v == null ? 1 : v + 1);
                        }
                    }
                }
                next += interval;
                if (i % INTLOG_INTERVAL == 0)
                    System.out.println("wrote " + i);
            }
            stackCount.entrySet().stream().filter(e -> e.getValue() > 1).forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (lock != null) {
                lock.release();
            }
        }
    });
    tailerThread.start();
    appenderThread.start();
    appenderThread.join();
    pretoucher.interrupt();
    pretoucher.join();
    // Pause to allow tailer to catch up (if needed)
    Jvm.pause(500);
    tailerThread.interrupt();
    tailerThread.join();
    System.out.println("wr: " + histogramWr.toLongMicrosFormat());
    System.out.println("in: " + histogramIn.toLongMicrosFormat());
    System.out.println("co: " + histogramCo.toLongMicrosFormat());
}
Also used : StackSampler(net.openhft.chronicle.core.threads.StackSampler) ExcerptTailer(net.openhft.chronicle.queue.ExcerptTailer) DocumentContext(net.openhft.chronicle.wire.DocumentContext) Histogram(net.openhft.chronicle.core.util.Histogram) ChronicleQueue(net.openhft.chronicle.queue.ChronicleQueue) BytesStore(net.openhft.chronicle.bytes.BytesStore) Wire(net.openhft.chronicle.wire.Wire) Main(net.openhft.chronicle.queue.benchmark.Main) Jvm(net.openhft.chronicle.core.Jvm) File(java.io.File) BufferMode(net.openhft.chronicle.queue.BufferMode) Time(net.openhft.chronicle.core.util.Time) LinkedHashMap(java.util.LinkedHashMap) SingleChronicleQueueBuilder(net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder) Nullable(org.jetbrains.annotations.Nullable) Bytes(net.openhft.chronicle.bytes.Bytes) AffinityLock(net.openhft.affinity.AffinityLock) IOTools(net.openhft.chronicle.core.io.IOTools) Map(java.util.Map) ExcerptAppender(net.openhft.chronicle.queue.ExcerptAppender) NotNull(org.jetbrains.annotations.NotNull) Affinity(net.openhft.affinity.Affinity) Histogram(net.openhft.chronicle.core.util.Histogram) Wire(net.openhft.chronicle.wire.Wire) NotNull(org.jetbrains.annotations.NotNull) ExcerptTailer(net.openhft.chronicle.queue.ExcerptTailer) AffinityLock(net.openhft.affinity.AffinityLock) LinkedHashMap(java.util.LinkedHashMap) ExcerptAppender(net.openhft.chronicle.queue.ExcerptAppender) DocumentContext(net.openhft.chronicle.wire.DocumentContext)

Example 32 with Wire

use of net.openhft.chronicle.wire.Wire in project Chronicle-Queue by OpenHFT.

the class SingleChronicleQueue method newIndex.

/**
 * Creates a new Excerpt containing and index which will be 1L << 17L bytes long, This method is used for creating
 * both the primary and secondary indexes. Chronicle Queue uses a root primary index ( each entry in the primary
 * index points to a unique a secondary index. The secondary index only records the addressForRead of every 64th except,
 * the except are linearly scanned from there on.
 *
 * @return the addressForRead of the Excerpt containing the usable index, just after the header
 */
long newIndex() {
    final ByteableLongArrayValues array = longArray.get();
    final long size = array.sizeInBytes(NUMBER_OF_ENTRIES_IN_EACH_INDEX);
    final Bytes buffer = NativeBytes.nativeBytes(size);
    buffer.zeroOut(0, size);
    final Wire wire = WireUtil.createWire(this.builder.wireType(), buffer);
    wire.write("index").int64array(NUMBER_OF_ENTRIES_IN_EACH_INDEX);
    buffer.flip();
    return appendMetaDataReturnAddress(buffer);
}
Also used : ByteableLongArrayValues(net.openhft.chronicle.wire.ByteableLongArrayValues) Wire(net.openhft.chronicle.wire.Wire)

Example 33 with Wire

use of net.openhft.chronicle.wire.Wire in project Chronicle-Queue by OpenHFT.

the class StagedPerformanceMain method producer.

public static void producer(int count, int intervalNS) {
    IFacadeAll datum = Values.newNativeReference(IFacadeAll.class);
    long datumSize = datum.maxSize();
    assert datumSize >= 500 && datumSize % 8 == 0;
    long start = System.nanoTime();
    try (ExcerptAppender appender = q0.acquireAppender()) {
        Thread pretoucher = new Thread(() -> {
            ExcerptAppender appender0 = q0.acquireAppender();
            Thread thread = Thread.currentThread();
            while (!thread.isInterrupted()) {
                appender0.pretouch();
                Jvm.pause(10);
            }
        });
        pretoucher.setDaemon(true);
        pretoucher.start();
        for (int i = 1; i <= count; i++) {
            long end = start + (long) intervalNS * i;
            while (System.nanoTime() <= end) Thread.yield();
            try (DocumentContext dc = appender.writingDocument()) {
                Wire wire = dc.wire();
                wire.write("data");
                Bytes<?> bytes = wire.bytes();
                long wp = bytes.writePosition();
                int paddingToAdd = (int) (-wp & 7);
                wire.addPadding(paddingToAdd);
                datum.bytesStore(bytes, bytes.writePosition(), datumSize);
                bytes.writeSkip(datumSize);
                // write the data
                populateDatum(count, datum, i);
            }
        }
        pretoucher.interrupt();
        try {
            pretoucher.join(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    long time = System.nanoTime() - start;
    if (!WARMUP) {
        System.out.println("Producer wrote " + count + " messages in " + time / 1000 / 1e6 + " seconds");
    }
}
Also used : ExcerptAppender(net.openhft.chronicle.queue.ExcerptAppender) DocumentContext(net.openhft.chronicle.wire.DocumentContext) Wire(net.openhft.chronicle.wire.Wire)

Aggregations

Wire (net.openhft.chronicle.wire.Wire)33 DocumentContext (net.openhft.chronicle.wire.DocumentContext)22 Test (org.junit.Test)11 File (java.io.File)9 ExcerptAppender (net.openhft.chronicle.queue.ExcerptAppender)8 NotNull (org.jetbrains.annotations.NotNull)8 Bytes (net.openhft.chronicle.bytes.Bytes)7 MappedBytes (net.openhft.chronicle.bytes.MappedBytes)7 ExcerptTailer (net.openhft.chronicle.queue.ExcerptTailer)6 IOException (java.io.IOException)5 ChronicleQueue (net.openhft.chronicle.queue.ChronicleQueue)5 BytesStore (net.openhft.chronicle.bytes.BytesStore)3 SingleChronicleQueue (net.openhft.chronicle.queue.impl.single.SingleChronicleQueue)3 Assert (org.junit.Assert)3 Ignore (org.junit.Ignore)3 LocalDateTime (java.time.LocalDateTime)2 Arrays (java.util.Arrays)2 Collection (java.util.Collection)2 Jvm (net.openhft.chronicle.core.Jvm)2 OS (net.openhft.chronicle.core.OS)2