LINUX.ORG.RU

Как отправить более приоритетные данные в дескриптор?

 ,


0

3

Дано:

1. tcp сокет. Один.
2. Большой поток данных, явно выше чем возможности сети, из-за чего сетевой буффер постоянно забивается (т.е. другими словами, poll() по этому дескриптору очень часто не возвращает POLLOUT в revents)

Задача:

Отправить кусочек данных В ПЕРВУЮ ОЧЕРЕДЬ, минуя стандартную очередь в ядре.

MSG_OOB не работает:

1. Только 1 байт будет приоритетным
2. Принимающая сторона которая получает данные используя read() не получает этот байт
3. Принимающая сторона которая использует recv() должна ОТДЕЛЬНО этот байт вытягивать с помощью этого же флага
4. Принимающая сторона может быть различным софтом, который иногда не поллит POLLPRI

Что делать?

★★★★★

не складировать пакеты в ядре, а сделать свою очередь пакетов, откуда пробрасывать в сокет, когда получил pollout. вставка пакета вне очереди тогда очевидна. не пойдет?

alysnix ★★★
()

Делай свою очередь, а длину очереди в ядре минимизируй. В своей очереди корми сокет маленькими порциями (размер порции можешь рассчитать исходя из пропускной способности и желаемого latency приоритетных данных), как только появляются приоритетные данные корми ими.

slovazap ★★★★★
()
Ответ на: комментарий от alysnix

не складировать пакеты в ядре, а сделать свою очередь пакетов

А когда отправлять из очереди в сокет? По таймеру? Порционно?

откуда пробрасывать в сокет, когда получил pollout. вставка пакета вне очереди тогда очевидна. не пойдет?

Когда получил pollout это означает что есть свободное место в буффере ядра на отправку. Если я УЖЕ отправил, но тут ВДРУГ ОЧЕНЬ ПРЯМ ЩАС надо отправить конкретный пакет... тогда это решение всё равно не помогает.

reprimand ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

Не используй функционал ядра.

Предлагаешь самому держать свой TCP стек в приложении?

Слишком жестко.

DAMN, THAT'S ROUGH DUDE!

reprimand ★★★★★
() автор топика
Последнее исправление: reprimand (всего исправлений: 1)
Ответ на: комментарий от slovazap

Делай свою очередь, а длину очереди в ядре минимизируй. В своей очереди корми сокет маленькими порциями (размер порции можешь рассчитать исходя из пропускной способности и желаемого latency приоритетных данных), как только появляются приоритетные данные корми ими.

Неплохой вариант, спасибо!

reprimand ★★★★★
() автор топика
Ответ на: комментарий от level1

Не вариант, к сожалению. Специфика приложения.

reprimand ★★★★★
() автор топика

Что делать?

Не являюсь крупным специалистом по этой проблеме, но я бы попробовал решать этот вопрос на уровне сетевой инфраструктуры. Можно засунуть приоритетный трафик в отдельный VLAN с указанием VLAN Priority.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Интересно, что там человечество придумало по всяким QoS?

pathfinder ★★★★
()
Ответ на: комментарий от reprimand

Открой отдельный сокет и шли по нему /тред

anonymous
()

Второй сетевой интерфейс(+отдельный порт на коммутаторе/маршрутизаторе),только для нужного Вам приложения на нем открываете сокет.

Можно настроить shaping/policing очереди (засунуть не приоритетные пакеты в не приоритетную очередь) на отправку пакетов. По типу http://www.infocity.kiev.ua/os/content/os395.phtml возможно в новых ядрах есть и другие инструменты
Что такое «стандартная очередь в ядре» ?

Vlad-76 ★★★★
()

Попробуйте...

RAW-sockets. Эти сокеты не обрабатываются ядром (файерволлом и т.д. и т.п.). Подразумевается что такого рода сокеты обрабатываются именно и чисто приложением самостоятельно. Там Вы сможете регулировать отправку данных как угодно, систем ане будлет вмешиваться.

Moisha_Liberman ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.