Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
Страницы: 1
RSS
Сокращение задержек, UniFi Network
 
Ребята, у меня есть две программы. Одна (клиент) принимает входные данные и отправляет их другой программе (серверу), которая генерирует изображение. Потом это изображение отправляется с сервера обратно клиенту. Клиент работает на одном компьютере, сервер — на другом. Всё общение происходит через UDP-сокеты.

Компьютеры «соединены» через два Ubiquiti PRO (https://www.amazon.com/Ubiquiti-Networks-802-11ac-Dual-Radio-UAP-AC-PRO-US/dp/B015PRO512).

Схема примерно такая:
Компьютер 1 — Роутер — Ubiquiti 1  <====> Ubiquiti 2 — Компьютер 2

Компьютер 2 берёт входные данные и отправляет их Компьютеру 1, Компьютер 1 генерирует изображение и отправляет его обратно Компьютеру 2.

Сейчас я отправляю (сжатое) Full HD изображение с частотой 90 Гц, что в сумме даёт около 250 Мбит/с. Использую канал шириной 80 МГц, чтобы уложиться в такую пропускную способность (до 500 Мбит/с на этом канале).

Сначала я отправлял все эти данные по гигабитному Ethernet-кабелю. После перехода на Ubiquiti заметил, что задержка увеличилась примерно на 10–12 мс. Также заметил, что чем больше данных посылаю, тем больше задержка.

Я думал, что сама работа устройств на линии может создавать задержку, но проверил соединение по кабелю между компьютерами с роутером и без него — в обоих случаях задержка была одинаковой, так что по крайней мере роутер на пути не влияет.

Хотелось бы понять, стоит ли ожидать такую задержку или это нетипично, и если нет — как можно её уменьшить?
 
Я особо не слежу за VR, но у меня сложилось впечатление, что то, что вы пытаетесь сделать — это исследовательская работа, так что не стоит ждать, что всё будет просто с готовым оборудованием. Поскольку вы уже занялись вопросом сжатия, возможно, стоит попробовать ещё больше распараллелить передачу. С одним точкой доступа можно, в принципе, разделить данные и использовать канал 2,4 ГГц дополнительно к каналу 5 ГГц, а в вашем беспроводном компьютере поставить две сетевые карты для приёма. Или можно применить два AP на 5 ГГц. В какой-то момент, наверное, станет возможным использовать канал 160 МГц, но, насколько я знаю, сейчас это пока недоступно.
 
Очевидно. Как я и говорил, я передаю 250 Мбит/с при 90 FPS, что примерно 200-300 КБ на кадр, а не 6 МБ, как было бы при несжатых данных. Но это не такая уж большая проблема, ведь мне удалось реализовать сжатие с помощью GPU, которое занимает около 0,65 мс на сжатие на GPU и передачу на CPU. Конечно, это увеличивает задержку, но всего на небольшую долю по сравнению с тем, что добавляет WiFi.
 
Тогда тебе капец. Wi-Fi ВСЕГДА медленнее проводного соединения.
 
Честно говоря, сомневаюсь, что они действительно будут 😉
 
@dpurgert предлагает неплохие идеи, хотя хватит ли их — вопрос открытый. Если у вас проблемы и с пропускной способностью, и с задержками, то сжатие — ваш друг, если только оно достаточно быстрое. Если вы можете сэкономить байт с помощью сжатия за меньшее реальное время, чем занимает передача этого байта, то стоит этим заняться. Так как вы работаете с видео, возможно, удастся использовать стандартные методы сжатия с аппаратной поддержкой. Но при ваших временных ограничениях это может не сработать. Вот почему VR/AR — это сложно, и почему до недавнего времени большинство решений были с проводным подключением.
 
У вас есть клиент с поддержкой 3x3 (ноутбук или что-то подобное), радиомодуль и 80 МГц абсолютно чистого спектра (к слову, единственное место, где вы действительно получите «абсолютно чистый спектр» — это анахоическая камера). В зависимости от детализации вашего тестового набора, это может быть как заметная, так и неочевидная разница. Если ваши тесты показывают шаг изменения только в 1 мс, скорее всего, вы ничего не заметите, ведь переключатель или маршрутизатор добавляет всего около полумиллисекунды к времени передачи (если вообще). Если у вас всего 4-5 мс в сумме, вам, скорее всего, понадобится 10 Gb и весьма вероятно специализированные ASIC-чипы (не говоря уже о кастомных ядрах и прочем). Как показали ваши тесты, базовый сетевой стек и обычное (гигабитное) оборудование добавляют примерно 4-5 мс к задержкам, которые вы видите при тестах на «localhost».
 
@AndCycle

Спасибо большое за это объяснение. Очень познавательно. «Или вам нужен весь потенциал UAP-AC-PRO», как мне раскрыть этот «весь потенциал»? Нужно ли что-то особенное настроить для моего устройства Ubiquiti?

@dpurgert

Если бы действительно в этом была проблема, разве соединение по кабелю с маршрутизатором и без него не давало бы разное время отклика?

@Vestas

Думаю, UDP был моим единственным вариантом. Мне казались доступны только UDP или TCP. TCP даёт ещё большую задержку. Я не против потерять «немного» пакетов. Конечно, если бы потери достигали 20%, это уже серьёзная проблема.

@phk46

Ну,

@AndCycle

моя догадка оказалась верной. Я хочу стримить изображение прямо на VR-гарнитуру, поэтому единственное разумное ограничение — минимальная задержка 😀. Бюджет, который я заложил, — 4-5 мс на сетевой трафик.
 
Кабель тоже слишком медленный. Для определённого объёма данных, который я отправляю, на локальном хосте задержка составляет 2 мс. При соединении двух компьютеров по кабелю задержка увеличивается до 6 мс. Учитывая, что скорость электромагнитных волн довольно высокая, я ожидаю, что задержка при беспроводной связи не будет больше 3-4 мс. Конечно, RTP не может быть быстрее UDP. UDP — это тонкий слой поверх IP, и от него можно ожидать примерно такую же задержку. Я упоминал это в контексте ряда других вопросов, на которые вы не ответили. Моя мысль в том, что лучше задержки вы не получите, но, возможно, если объясните проблему подробнее, кто-то сможет предложить подход, который решит ваш вопрос в рамках разумных сетевых ограничений. С другой стороны, легко сделать прототип целиком на одной системе, рассчитывая потом распределить его по сети. Но когда начинаешь это распределение, может выясниться, что просто не получается из-за слишком разных временных масштабов. Такие проблемы обычно решаются с помощью буферизации, но это добавляет задержку.
 
Ах, забыл упомянуть, WiFi — это полудуплекс, то есть скорость передачи и приёма данных делят одну полосу пропускания, из-за этого задержки выше.
 
Суть в том, что твой код не устойчив к работе в условиях (по определению) конкурирующей среды. Я не хочу обидеть, ты продумал логику и код работает в проводной среде, где конкуренции по сути нет, но, к сожалению, 802.11 устроен иначе. Тебе придется закладывать некоторую терпимость к задержкам и ошибкам, если используешь беспроводную связь, независимо от протокола. На мой взгляд, UDP — худший выбор для беспроводных сетей. Сомневаюсь, что это будет работать где-то, кроме PtP беспроводных соединений, и даже там результат будет довольно сомнительным.
 
Мой предположительный вариант — он занимается обработкой видео в реальном времени для VR/AR или чего-то в этом роде, где нет большой терпимости к задержкам, потому что это напрямую связано с взаимодействием человека.
 
Кабель тоже слишком медленный. Для некоторого набора данных, которые я отправляю, на локальном хосте у меня задержка 2 мс. Использование двух компьютеров, соединённых кабелем, увеличивает её до 6 мс. Учитывая, что скорость электромагнитных волн довольно высокая, я ожидаю задержку беспроводной связи не больше 3–4 мс, плюс время обработки. Локальный хост — это полностью локально, и ограничено только самой машиной. А удалённый путь гораздо длиннее: машина A –> сеть –> передача по проводу (скорость света в проводе / расстояние) (коммутатор, если есть, затем снова скорость света в проводе / расстояние до машины B) –> машина B –> приём с провода –> сеть –> память –> программа. Вы добавляете 4 миллисекунды на обработку данных сетью и машиной B того, что отправляет машина A. Всё у вас отлично работает. Если вам важна каждая миллисекунда, наверное, стоит начать переговоры с IBM и Cray.
 
Я почти уверен, что из этого ничего не выжать, потому что инфраструктура не рассчитана на низкую задержку. Сколько времени, по твоему, нужно, чтобы передать 250 Мбит/с по сети 1 Гбит/с? И сколько — по ещё более узкополосному беспроводному устройству? Это не мгновенно, даже передача 250 Мбит/с по 1 Гбит/с не обходится без задержек, это занимает четверть доли секунды.

Давай прикинем простую математику. Ты говоришь, что твоё HD-видео — 90 Гц, значит, наверное, ты имеешь в виду 90 кадров в секунду. 250 Мбит / 90 = 2,8 Мбит на кадр. Передача 2,8 Мбит по сети 1 Гбит/с требует 2,8 мс. А теперь попробуй передать эти 2,8 Мбит по беспроводной сети с пропускной способностью 500 Мбит/с — это уже вдвое большая задержка, 5,6 мс.

Это оценка в идеальном мире, который не существует. Данные нужно ещё обрабатывать, и это добавляет задержку. Почти 3 мс разницы из-за пропускной способности плюс туда-сюда и всякие проблемы с беспроводной связью — вот тебе и объяснение задержки в 10-12 мс, которую ты наблюдаешь. Твоя задержка вызвана пропускной способностью, а не электромагнитными волнами.

Если хочешь более низкую задержку — сначала нужно увеличить пропускную способность. В вещательной индустрии низкая задержка при беспроводной передаче необработанного видеосигнала требует специального оборудования. Я имею в виду — никакого UDP/TCP, никакого WiFi и очень дорогое, специализированное фирменное железо. Ты не найдёшь ничего, что поможет без затрат в несколько тысяч долларов.

Высокая пропускная способность — это базовое требование для низкой задержки. Тебе нужна сеть с проводным соединением на 10 Гбит/с или полный потенциал UAP-AC-PRO, то есть твой клиент должен уметь использовать 3x3 1300 Мбит/с, чтобы соответствовать 1 Гбит/с проводной сети.

P.S. Да, я много правил, наверное, не стоило писать это во время работы.
 
Разве тебе не приходило в голову, что я занимаюсь и другими делами, и у меня ограничено время на всё это? Тут нужна беспроводная связь, и задержка сильно варьируется в зависимости от многих факторов, например, расстояния между точками доступа. Задержка в 16-20 мс, о которой я говорил в оригинальном посте, — это настоящая проблема для моего случая. Пожалуйста, перестань умничать, не зная всей картины.
 
Это самое глупое, что я сегодня прочитал. Человеческому мозгу требуется от 13 до 80 миллисекунд, чтобы увидеть изображение, а ты тут жалуешься на задержку в 6 миллисекунд для совсем неважной задачи обработки изображения. Миллениалы — поколение мгновенного удовлетворения...
 
Если UDP мне не подходит, почему тогда что-то поверх UDP (например, RTP) должно помочь? Кабель тоже слишком медленный. Для определённого объёма данных, которые я отправляю, на localhost задержка составляет 2 мс. При использовании двух компьютеров, соединённых кабелем, эта задержка увеличивается до 6 мс. Учитывая, что скорость электромагнитных волн очень высока, я ожидал, что задержка при беспроводной связи будет не больше 3-4 мс.
 
Да, задержка при работе через Wi-Fi — это то, чего стоит ожидать. Используйте кабель.
 
*Почему* задержка важна в этом приложении? Насколько я понимаю, вы делаете некий захват данных, отправляете их на сервер для анализа, а затем получаете изображение для отображения. Если это предназначено для восприятия человеком, любая задержка меньше 100 мс будет фактически незаметна. А если вы просто добавляете новые точки на график, то большую задержку, вероятно, можно будет терпеть. Если вы можете мириться с пропусками данных, но нужно сохранить относительную синхронность, тогда стоит рассмотреть использование RTP — он работает поверх UDP и разработан именно для таких задач.
 
Понятно. Так что ты предлагаешь? Я хочу сделать двухзвенную «связь». Мне нужно передавать данные с одного настольного компьютера на другой (который в итоге будет отдельным устройством), и при этом я не хочу ничего лишнего — никаких повторных передач и тому подобного. Я понимаю, что часть данных может быть испорчена, поэтому CRC-коды обязательны, но мне действительно нужно только самое необходимое.
Страницы: 1
Читают тему (гостей: 1)