Ставить или не ставить в очередь для низкой задержки

Я пишу программу с малой задержкой на С++, которая получает данные из источника, обрабатывает данные и отправляет в цель через сокет TCP. У меня есть отдельный поток для всех этих 3 модулей, поток получателя, поток процессора, поток отправителя. Все эти потоки взаимодействуют с незаблокированными очередями.
Считаете ли вы, что отправка сообщения напрямую, а не использование очереди для части отправителя, уменьшит задержку? Влияет ли это на стабильность производительности?
Спасибо.


person xyzt    schedule 06.09.2019    source источник
comment
Я думаю, что невозможно дать общий ответ «да» или «нет» для всех обстоятельств. Это зависит от очень многих вещей, и простое измерение — единственное, что действительно дает вам хороший ответ.   -  person PeterT    schedule 06.09.2019
comment
Какова цель трех потоков? Не было бы быстрее, если бы один поток получал данные, обрабатывал их, а затем отправлял ответ, не тратя время на переключение потоков? Как большее количество потоков снижает задержку?   -  person David Schwartz    schedule 06.09.2019
comment
@DavidSchwartz, если приложение не может позволить себе сбрасывать данные, вам нужна такая конструкция (отдельные потоки получателя и процессора с промежуточным буфером событий) для обработки скачков объема. С потоками, закрепленными на ЦП и использующими структуру данных без блокировки, не тратится время на переключение потоков. Однако синхронизация кеша ЦП требует небольших затрат. @ xyzt обычно используется поток процессора для отправки данных. Теоретически поток-отправитель просто записывает данные в буфер сокета, верно? (сказав это, я никогда не сравнивал это. Пожалуйста, не стесняйтесь проверять это, чтобы доказать теорию)   -  person SPD    schedule 06.09.2019
comment
@SPD Я думаю, что однопоточный асинхронный режим будет работать так же. И если он не может обрабатывать пакеты достаточно быстро, у него другая проблема, и в любом случае в конечном итоге не хватит памяти. Так что я предполагаю, что это вопрос размера очереди RX ядра, нагрузочного тестирования, бенчмаркинга и, что важно, профилирования. @ xyzt никакие аргументы маханием руками здесь не помогут. Вы должны сделать все три, чтобы получить окончательный ответ: эталонный тест и нагрузочный тест при профилировании.   -  person Tom Trebicky    schedule 06.09.2019
comment
@TomTrebicky зависит от требований к отказоустойчивости/характеристик потока пакетов, очередь сообщений на уровне приложения — это способ справиться с резким скачком объема сетевых пакетов. Если скорость обработки постоянно ниже скорости поступления пакетов, то это совсем другая история.   -  person SPD    schedule 06.09.2019


Ответы (1)


Если три потока закреплены за разными физическими ядрами, наличие отдельного потока отправителя даст меньшую задержку, чем поток процессора, выполняющий операцию отправки, особенно если в процессе отправки происходят повторные попытки. Даже если это лучшая асинхронная отправка, вы все равно можете сэкономить минимальное время, необходимое для записи в сокет.

person Kushal Babel    schedule 18.09.2019