У меня есть установка, при которой одна «ведущая» система 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
Третий - это «фильтр всех совпадений». Однако это не имеет значения. Я все еще получаю такие же шипы.
Ответы:
Первое: Linux не является операционной системой реального времени. Невозможно сказать ядру, что некоторые приложения должны реагировать на какое-то событие в заданный период времени, например, 3-4 мс, и дать гарантию, что это произойдет. Таким образом, всякий раз, когда система загружается, вы должны предполагать, что будут задержки.
Тем не менее, вы можете настроить вещи в пользу вашего приложения приема пакетов UDP:
В Linux есть управление сетевым трафиком (см., Например, Traffic Control HOWTO , пример скрипта для DSL с ограниченной пропускной способностью ), который вы можете использовать для настройки разных очередей с разными приоритетами, например, для ваших пакетов UDP и для больших пакетов.
В Linux есть cgroups (контрольные группы), которые вы можете использовать для назначения различных приоритетов и пределов ввода-вывода для вашего процесса получения UDP и
ftpd
/ /sshd
процессов, потому что я предполагаю, что дисковый ввод-вывод другими процессами также может остановить ваш Приложение для приема UDP-пакетов (поэкспериментируйте, чтобы узнать, правда ли это).Опять же: нет способа гарантировать что-либо.
источник