Правильно ли это?
- шаблон disruptor имеет лучшую параллельную производительность и масштабируемость, если каждая запись должна обрабатываться несколькими способами (операции или аннотации), так как это может быть распараллелировано с использованием нескольких потребителей без конкуренции.
- Напротив, кража работы (т.е. хранение записей локально и кража записей из других потоков) имеет лучшую параллельную производительность и масштабируемость, если каждая запись имеет для обработки только одним способом, поскольку раздельное распределение записей на несколько потоков в шаблоне прерывания вызывает конфликт.
(И это шаблон disruptor все еще намного быстрее, чем другие блокированные многопроцессорные многопользовательские очереди (например, от boost), когда несколько продюсеров (т.е. Операции CAS)?
Мое положение подробно:
Обработка записи может привести к появлению нескольких новых записей, которые также должны быть обработаны. Производительность имеет наивысший приоритет, записи, обрабатываемые в порядке FIFO, имеют второй приоритет.
В текущей реализации каждый поток использует локальный FIFO, где он добавляет новые записи. Неработающие потоки воруют работу из другого потока FIFO. Зависимости между обработкой потоков решаются с помощью заблокированной, механически симпатичной хеш-таблицы (CAS для записи, с гранулярностью в виде ковша). Это приводит к довольно низкой конкуренции, но порядок FIFO иногда нарушается.
Использование шаблона разрушителя будет гарантировать порядок FIFO. Но не будет ли распространять записи на потоки, вызывая гораздо более высокий конфликт (например, CAS на курсоре чтения), чем для локальных FIFO с кражей работы (каждая пропускная способность потока примерно одинакова)?
Ссылки, найденные мной
Тесты производительности в стандартном техническом документе о разрушителе (глава 5 + 6) не охватывают непересекающееся распределение работы.
https://groups.google.com/forum/?fromgroups=#!topic/lmax-disruptor/tt3wQthBYd0 - это единственная ссылка, которую я нашел на краже или краже работы. В нем указано, что очередь на поток значительно медленнее, если есть какое-либо общее состояние, но не входит в детали или объясняет почему. Я сомневаюсь, что это предложение относится к моей ситуации:
- разделяемое состояние, разрешенное без блокировки хеш-таблицы;
- с целью раздельного распределения записей среди потребителей;
- за исключением кражи работы, каждый поток читает и записывает только в свою локальную очередь.