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