Что такое хорошая библиотека журналов для систем реального времени (быстрая без создания объектов)? - PullRequest
4 голосов
/ 28 марта 2012

Я попытался выполнить вход, но он создал кучу мусора.Кто-нибудь слышал о хорошем для Java в реальном времени?


@ Берни: Я сделал цикл регистрации 1М кэшированных сообщений и GC сошел с ума.

Ответы [ 3 ]

15 голосов
/ 28 марта 2012

У меня есть библиотека, которая может регистрировать текстовые или двоичные данные за микросекунды без создания мусора или даже системного вызова.

https://github.com/peter-lawrey/Java-Chronicle

Журнал также может быть прочитан в режиме реального времени любым числом процессов чтения, что дает вам постоянную очередь, которая может обрабатывать более 5 миллионов сообщений в секунду.

2 голосов
/ 23 мая 2014

Вы можете взглянуть на CoralLog , разработанный Coral Blocks (с которым я связан), который производит нулевой мусор и имеет среднюю задержку 53 наносекунды при регистрации 64-байтового сообщения.Что касается пропускной способности, он может регистрировать 2,6 миллиона 64-байтовых сообщений в секунду с отметками времени и 3,5 миллиона 64-байтовых сообщений в секунду без отметок времени .Полные результаты тестов можно увидеть здесь .

Если вы уменьшите размер сообщения до 16 байт, вы сможете регистрировать 5,2 миллиона сообщений в секунду без временных отметок.

Ниже приведенопростой тест пропускной способности:

package com.coralblocks.corallog.bench;

import java.io.File;
import java.nio.ByteBuffer;

import com.coralblocks.corallog.AsyncThread;
import com.coralblocks.corallog.Log;
import com.coralblocks.corallog.Logger;

public class PerformanceTest4 {

    public static void main(String[] args) throws Exception {

        int batchSize = Integer.parseInt(args[0]);
        int passes = Integer.parseInt(args[1]);
        int msgSize = Integer.parseInt(args[2]);

        byte[] msgBytes = new byte[msgSize];

        // build a dummy message:
        for(int i = 0; i < msgBytes.length; i++) {
             msgBytes[i] = (byte) String.valueOf(i % 10).charAt(0);
        }

        ByteBuffer bb = ByteBuffer.wrap(msgBytes);

        Log.setIncludeTopHeader(false);

        String dir = ".";
        String filename = "throughput.log";

        Logger logger;
        boolean isMmap = System.getProperty("logMemoryMappedFile", "true").equals("true");

        if (isMmap) {
            logger = Log.createMemoryMappedLogger(dir, filename, null /* no timestamps */, false /* not synchronized */, true /* asynchronous */);
        } else {
            logger = Log.createLogger(dir, filename, null, false, true);
        }

        int count = 0;

        while(count < passes) {

            long start = System.nanoTime();

            for(int i = 0; i < batchSize; i++) {
            bb.position(0);
            logger.log(bb);
            }

            long time = System.nanoTime() - start;

            double seconds = (((double) time) / 1000000000L);

            System.out.println("Batch " + (count + 1) + " took: " + seconds + " s");

            count++;
        }

        logger.drainCloseAndWait();

        boolean deleteFile = System.getProperty("deleteFile", "true").equals("true");

        if (deleteFile) {
            File f = new File(dir, filename);
            f.delete();
        }

        AsyncThread.drainAndDie(); // just so the vm will exit... (async thread is not daemon)
    }
}
0 голосов
/ 23 июня 2012

Javolution предоставляет возможности регистрации.

Из javadoc LogContext:

Тот же код может быть запущен с использованием системного выхода / ошибки, стандартное ведение журнала (java.util.logging), Log4J или даже OSGI Log. Выбор может быть сделано во время выполнения через configuration).

('configuration' относится к классу Javolution).

...