2015-07-22 7 views
1

Предположим, что у меня есть m UDP-потоки, уникально идентифицированные некоторым идентификатором (например, RSR SSRC). Мне нужно обработать их в n связанных потоках, а ассоциация - 1-N, то есть один поток UDP обрабатывается одним или несколькими потоками.Обработка нескольких потоков UDP

Какова разница в производительности сети стека ядра, если I:

  1. Start m UDP серверов, каждый на другой порт. Каждый сервер обрабатывает один поток и подталкивает его к одному или нескольким связанным потокам.

  2. Запустите только один сервер. Все потоки обрабатываются одним портом, и этот поток подталкивает каждый поток данных рядом с одним или несколькими связанными потоками.

Я думаю, что дело доходит до вопроса: лучше ли открыть один порт или многие из них, где каждый получит пропорционально меньше данных?

Возможно ли, что один разъем может быть перегружен количеством входящих данных? Или, может быть, сокет, который является более логичным в ядре Linux, чем физическое, не так много делает, что сами данные, так что нет никакой реальной разницы?

Какое максимальное битрейт может обрабатывать один UDP-сокет (с увеличенным буфером)?

Я уверен, что лучше всего найду ответ, просмотрев сетевой код ядра, но, возможно, кто-то может дать ответ сразу, пожалуйста. Спасибо.

+1

больше портов с каждым портом, предназначенным для определенного входящего потока UDP-пакетов. Linux будет буферизовать UDP-пакеты, поэтому маловероятно, что любые пакеты будут потеряны в ОС; однако пакеты могут быть потеряны где угодно до этого момента. Примечание. Я видел буфер Linux до 10 секунд UDP-пакетов данных GPS. – user3629249

+0

Очень дорогая (100-е из K $ в год) система обмена сообщениями с крайне низкой задержкой, которую мы используем на работе, имеет настраиваемое свойство конфигурации, которое позволяет вам указать, сколько портов UDP оно прослушивает. Они рекомендуют вам профиль и настраиваются в соответствии с вашей рабочей нагрузкой и средой. Хороший совет, я думаю. –

+0

@ AndyBrown System - вы имеете в виду программу? Как это написано? Возможно, это сетевой драйвер? – 4pie0

ответ

1

Чем больше у вас сокетов, тем больше у вас приемных буферов, поэтому для входящих данных доступно больше места.

Это говорит о том, что предпочтительнее использовать несколько сокетов.

Однако дейтаграммы могут быть потеряны в любом месте, а не только на целевом узле.

+0

Да, котировки дейтраграмм могут быть потеряны повсюду, меня интересует только производительность обработки. Спасибо. – 4pie0

+0

Вы сказали, что вас интересует «производительность сети» и количество входящих данных. Ни слова о переработке. Прими решение. – EJP

+0

Производительность сетевого стека ядра – 4pie0

2

Нелегко ответить на этот вопрос, потому что все это сводится к скорости обработки ваших потоков и тому, как вы делегируете работу среди них.
Если вы считаете, что сокет udp будет перегружен, вы можете создать очередь прямо за сокет udp. Эта очередь может расти настолько, насколько вы позволяете ей расти. Конечно, вы тогда используете больше памяти.

То, что у вас будет тогда, является парадигмой потребителей/производителей. Один поток помещает вещи в очередь, другие потоки берут из очереди.

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

Существуют рамки, посвященные задаче обработки мультимедиа. Вы можете взглянуть на gstreamer. http://gstreamer.freedesktop.org/documentation/ У этого есть поддержка RTP и в основном система, которая позволяет создать трубопровод потока данных, который является именно тем, что вы здесь делаете.

Вы обнаружите, что gstreamer имеет готовые очереди, которые позволяют помещать в очередь некоторые данные где-то в конвейере.Это так или иначе доказывает мне, что что-то вроде этого необходимо, когда вы обрабатываете на высоких скоростях. Хотя я не специалист по gstreamer. Gstreamer имеет строительные блоки, поэтому вы можете экспериментировать с конвейером и легко добавлять очереди, удалять их и сравнивать результаты всего конвейера. Это требует изучения, чтобы узнать api. На C. C.

+0

Меня интересует, если в случае одного ядра ядро ​​не начнет отбрасывать данные, в то время как в случае многих сокетов те же самые данные, которые распространяются в них, будут в порядке. – 4pie0

+0

Это требует некоторых экспериментов, чтобы действительно знать. В системах, где я использовал это, очередь за сокетом решена многими проблемами. –

+0

Филипп, спасибо вам за подсказки. – 4pie0

Смежные вопросы