Я использую структуру Disruptor для выполнения быстрой коррекции ошибок Рида-Соломона по некоторым данным. Это моя настройка:
RS Decoder 1
/ \
Producer- ... - Consumer
\ /
RS Decoder 8
- Производитель считывает блоки из 2064 байт с диска в буфер байта.
- Пользователи RS-декодера 8 параллельно выполняют коррекцию ошибок Рида-Соломона.
- Пользователь пишет файлы на диск.
В терминах DSL дефрагментатора настройка выглядит следующим образом:
RsFrameEventHandler[] rsWorkers = new RsFrameEventHandler[numRsWorkers];
for (int i = 0; i < numRsWorkers; i++) {
rsWorkers[i] = new RsFrameEventHandler(numRsWorkers, i);
}
disruptor.handleEventsWith(rsWorkers)
.then(writerHandler);
Когда у меня нет потребителя вывода диска (нет .then(writerHandler)
), измеренная пропускная способность составляет 80 М/с, как только я добавляю потребителя, даже если он пишет в /dev/null
или doesn ' t даже писать, но объявляется как зависимый потребитель, производительность падает до 50-65 М/с.
Я профилировал его с помощью Oracle Mission Control, и это показывает график использования ЦП:
Без дополнительного пользователя:
С дополнительным потребителем:
Что это за серая часть графика и откуда она? Я полагаю, что это связано с синхронизацией потоков, но я не могу найти никакой другой статистики в Mission Control, которая указывала бы на такую задержку или противоречие.