У меня есть установка, в которой одна "главная" система Linux взаимодействует с 3 "подчиненными" системами, также работающими под управлением Linux, на выделенном интерфейсе Ethernet (только мастер и 3 подчиненных). Ведомые устройства отправляют данные ведущему через UDP каждые 5 мс или около того. Кроме того, мастер имеет приложения, которые непрерывно извлекают файлы из всех трех ведомых по протоколам FTP, SCP и т.д.

Пакеты UDP должны собираться ведущим как можно быстрее, предпочтительно в течение 3-4 мс. Когда я запускаю установку только с приложением приема UDP, работающим на главном компьютере, я вижу, что это условие легко выполняется. Тем не менее, когда FTP/SCP/ и т.д. приложения также остаются запущенными, во время приема наблюдаются всплески. Размер передаваемых файлов несколько меньше, но каждый второй или около того получает новый файл от каждого ведомого устройства.

Тот факт, что результаты хороши при запуске установки без активных приложений передачи файлов, говорит о том, что "организация очередей / планирование" в сети Linux, похоже, дает одинаковый приоритет как UDP, так и другим протоколам. Может быть, он даже удерживает UDP, если FTP работает?

Есть ли способ сообщить Linux (программно / командам), чтобы он отдавал наивысший приоритет связи UDP и "приостанавливал" другие вещи, такие как передача файлов, когда сообщение UDP готово к приему?

Редактировать 1: я добавил их для управления трафиком на основе типа протокола (UDP - протокол 17)

tc qdisc add dev eth0 root handle 10: prio
tc filter add dev eth0 parent 10: protocol ip prio 1 u32 match ip protocol 17 0xff flowid 10:1
tc filter add dev eth0 parent 10: prio 3 protocol all u32 match u32 0 0 flowid 10:3

Третий - это "фильтр всех совпадений". Однако это не имеет значения. Я все еще получаю такие же шипы.

1 ответ1

1

Первое: Linux не является операционной системой реального времени. Невозможно сказать ядру, что некоторые приложения должны реагировать на какое-то событие в заданный период времени, например, 3-4 мс, и дать гарантию, что это произойдет. Поэтому всякий раз, когда система загружается, вы должны предполагать, что будут задержки.

Тем не менее, вы можете настроить вещи в пользу вашего приложения приема UDP-пакетов:

  • В Linux есть управление сетевым трафиком (см., Например, Traffic Control HOWTO, пример скрипта для DSL с ограниченной пропускной способностью), который вы можете использовать для настройки разных очередей с разными приоритетами, например, для ваших пакетов UDP и для больших пакетов.

  • В Linux есть cgroups (контрольные группы), которые можно использовать для назначения различных приоритетов и пределов ввода-вывода для вашего процесса получения UDP, процессов ftpd/sshd и т.д., Так как я предполагаю, что дисковый ввод-вывод другими процессами также может остановите ваше приложение для приема UDP-пакетов (поэкспериментируйте, чтобы узнать, так ли это).

Опять же: нет способа гарантировать что-либо.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .