Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Максимальный размер входного буфера UDP-сокета (2 стр)

Максимальный размер входного буфера UDP-сокета (2 стр)

Страницы: 1 2 3 Следующая »
Ghost2Постоялецwww13 янв. 201811:57#15
Zab

> это как раз вредительская опция
Слушай, лучше не пиши тут ничего. Возможно, ты сэкономишь людям много времени.

RammПостоялецwww13 янв. 201812:10#16
Ghost2
> Слушай, лучше не пиши тут ничего. Возможно, ты сэкономишь людям много времени.
Да ладно, ничего страшного в этом нет, лучше пусть человек напишет, и если он неправ - его еще 2 человека поправят.
А так, на других форумах только темы без ответов висят, да дебильные вопросы обсуждаются, типа перевода из string в int, ответ на которые гуглится за 30 секунд.
Ghost2Постоялецwww13 янв. 201812:19#17
Ramm

Я работаю с потоками примерно 8000 пакетов в секунду (по 1100 байт) на 100 Мб. Чтобы ничего не терять, хватает буфера на 4 МБ. И это видимо с некоторым запасом, потому что и с 2 МБ тоже работает. Теряется где-то 1-2 пакета за минуту, а если ничего не трогать, долго может работать вообще без потерь.

И да, не нужно думать, что если нужно отправить 30000 пакетов по 1000 байт, то необходим приемный буфер 30 МБ. Отправка/приём это тоже процессы, во время течения которых ОСь разгребает буферы сокетов.

Единственное что - карточка должна быть поновее, на легаси сетевухах (тех что 100 Мб онли) пакеты могут тухнуть в самой сетевухе.

RammПостоялецwww13 янв. 201812:33#18
Ghost2
А язык какой?
А как устанавливаете размер буфера?
А буфер отправки не трогаете?

Правка: 13 янв. 2018 12:36

Ghost2Постоялецwww13 янв. 201813:05#19
Ramm

C++, через setsockopt.

> А буфер отправки не трогаете?
Отправка реализована в железе (на ПЛИС), там такого понятия не существует. Все уходит в реальном времени без буферизации. На PC же буфер отправки для особого смысла не имеет, т.к. нет смысла буферизировать исходящий UDP трафик, оно сразу в сетевуху должно попадать.

DampireПостоялецwww13 янв. 201813:25#20
Я вообще не распарсил в чем вопрос. Зачем тебе знать максимальный размер буфера? Ну допустим в линуксе он равен 2^32 - 1, если мне память не изменяет и что дальше? Минимальный размер буфера вычисляется из размера пакета, помноженного на количество источников, на рейт и предсказанное латенси. Сильно много будет?

Upd. Ну и разделить на recv rate, иначе будет за секунду.

Правка: 13 янв. 2018 17:44

RammПостоялецwww13 янв. 201815:27#21
Dampire
Размер буфера сокета. Я ж пояснил там все, даже описал, что произойдет, если кидать больше пакетов, чем влезет в буфер и не успеть прочитать их, т.е. искусственно не успеть, но это реально. Предположим 30 клиентов шлют по 100 пакетов в секунду, каждый по килобайту, запросто может возникнуть ситуация, когда на сокет разово придет больше 8КБ, или поток будет обрабатывать-копировать пришедшие и на несколько миллисекунд просядет - все, потеря пакетов, при том, что ее можно избежать.
А если пакеты будут по 5-10Кб, то эта проблема станет постоянной. У меня 9 из 10 пакетов пропадут.
Че непонятного-то?

На той странице в последнем моем сообщении тесты...
Я научился изменять буфер, но не знаю, правильно ли это все, или стоит делать как-то по-другому. Ну и мнение шарповода тоже хотелось бы услышать, но тут таких, я понимаю, нет=)

И еще, а как с этим дела на Линуксе? Там какой-то особый буфер у сокетов?

Zab, можешь попробовать так же, отправить на сокет пару сотен килобайтных пакетов, а затем попробовать прочитать, спустя время, когда они все уже должны придти. Уверен, то же самое будет - те, что не вместятся в буфер, пропадут.

Правка: 13 янв. 2018 15:51

Ghost2Постоялецwww13 янв. 201816:14#22
Ramm

> запросто может возникнуть ситуация, когда на сокет разово придет больше 8КБ
Вот у тебя размер буфера должен быть равен тому, сколько на него разово может прийти. Скажем, при передаче видео по RTP нужно иметь буферы не меньше чем размер сжатого ключевого кадра. RTP это пример неравномерно загруженного канала. С равномерно загруженным размер буфера зависит от периода опроса. Который в общем случае величина переменная, нужно ставить эксперименты и брать с запасом.

Ghost2Постоялецwww13 янв. 201816:20#23
Ramm

> И еще, а как с этим дела на Линуксе? Там какой-то особый буфер у сокетов?
На Линуксе - та же опция сокета. Только есть один неочевидный нюанс ужа виде системной настройки net.core.rmem_max, больше которой буфер быть не может (на самом деле, практика показывает, что не может быть в два раза больше). Умолчания разные на разных дистрах. Точных цифр не помню, я видел от 200+ до 400+ КБ.

ZabПостоялецwww13 янв. 201817:01#24
Ramm
> Хотите сказать, если вы создадите сокет, я пришлю на него 100 тыщщ пакетов, и
> все эти сотни мегабайтов засядут у вас в ОЗУ? Или как?
udp-пакеты могут выбрасываться на любом из этапов доставки, если вдруг что переполнилось. На серверах доставки обычно полностью сбрасываются буфера при переполнении, пропадает не "то что не поместилось", а вообще все что не успело уйти дальше по всем направлениям сразу.
Выбрасываться может и в момент отправки, если посылать из одного места слишком много. Не знаю как в винде, сбрасывается все или игнорируются send'ы в условиях забитых буферов.
ZabПостоялецwww13 янв. 201817:04#25
Ghost2
> Слушай, лучше не пиши тут ничего. Возможно, ты сэкономишь людям много времени.
Ты прав, не надо было писать в условиях, когда по новой расковыривать лень, а то что смотрел десять лет назад уже плохо помню.
А с какой стати хорошо помнить то, что было осмотрено очень давно и признано непригодным к употреблению?
DampireПостоялецwww13 янв. 201817:32#26
Ramm
> когда на сокет разово придет больше 8КБ
Тебе уже несколько раз ответили - увеличь буфер до рассчетного размера: 1, 2, 10 мегабайт. У тебя серьезно может быть 100 мегабайт при тикрейте сервера равном 30? Сколькож там у тебя клиентов? Если буфер переполняется очевидно что-то не так и потеря пакетов - нормальное поведение. Значит сервер не справляется. Увеличивай тикрейт и мощности сервера, чтобы укладывался в тикрейт. Если тебе нужно использовать максимально возможный размер буфера - ты явно что-то делаешь не так. Впрочем как и в прошлой теме - очередные теоретические и абсолютно искусственные проблемы сам себе придумал и решаешь их.

Правка: 13 янв. 2018 17:33

RammПостоялецwww13 янв. 201821:04#27
Спасиибо всем! Поставлю 8Мб на один сокет, и таких сокетов штук 10 - мне этого с головой. И если смогу портировать под Линукс - там тоже должно работать... Вроде так...?
DampireПостоялецwww14 янв. 201815:13#28
Не должно. Ты вообще ответы читаешь?
Ghost2
> Умолчания разные на разных дистрах. Точных цифр не помню, я видел от 200+ до 400+ КБ.
RammПостоялецwww17 янв. 20188:16#29
Dampire
В том-то и прикол, что читаю!
Ghost2
> Умолчания разные на разных дистрах. Точных цифр не помню, я видел от 200+ до
> 400+ КБ.
Написали же, что это по умолчанию размер буфера. Или я не прав?
http://code.i-harness.com/ru/q/fb29e5

Правка: 17 янв. 2018 8:25

Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / Сеть

2001—2018 © GameDev.ru — Разработка игр