|
Передача по UDP., Почему так медленно? |
|
|
|
Jan 26 2014, 08:51
|
Частый гость
 
Группа: Свой
Сообщений: 137
Регистрация: 10-04-07
Из: г. Троицк
Пользователь №: 26 907

|
Сразу оговариваюсь: только начинаю разбираться с IP, и посему извиняюсь за возможные некорректные формулировки и вопросы. Изначально стоит задача обмена по UDP между железкой и PC но для "отработки технологии" я попробовал организовать связь между двумя РС. Программировал в Builder XE5 (если это играет какую-то роль) + Winsock. Схема максимально примитивная: на сервере зациклен receivefrom() а клиент выполнят 10 раз подряд sendto() пакета размером 1400 байт.
На картинке снифера видно, что на все это уходит целых 7мс, т.е. получаем всего 2 мегабайта/с  . Не маловато для сети 100 Мбит? Предположил, что лишнее время уходит на вызов sendto() и какие-то действия внутри нее и решил передавать данные более крупными кусками - не вышло, передается только один пакет максимального размера. Все-таки UDP должен уметь нарезать передаваемые данные на несколько ethernet-пакетов или за этим только к TCP?
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Jan 26 2014, 20:27
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(b-volkov @ Jan 26 2014, 12:51)  ...Все-таки UDP должен уметь нарезать передаваемые данные на несколько ethernet-пакетов или за этим только к TCP? UDP распологается над IP. IP может имееть фрагментацию. на приёмной стороне стэк должен уметь так называемо ре-ассемблировать = собирать по идентификатору IP пакета полный пакет. По приходу конца - проверять наличие собранных кусков и отдавать уровню выше. Либо хранить некоторое время, перед тем как выкинуть. IP пакеты могут приходить в произвольном порядке. По умолчанию размер пакета 1500 + изернет фрэйм + CRC его. IP пакет может нести необязательные поля после своего хедера в первом фрагменте. Для ускорения передачи, можно подкорректировать временные задержки. я сейчас на вскидку не помню названия, но на уровне сокетов есть такие настройки. попробуйте сравнить скорость со стандартным пингом. пошлите те-же 14000 раз 100 и посмотрите картину по скорости. у меня с ноута задержки при стандартном пинге составляют порядка <=10 мкс между уходами пакетов. АРМ на порядок где то побольше = около 120 мкс. по памяти: всего пинг 7770 писюк-арм около <=2мс в среднем.
|
|
|
|
|
Jan 31 2014, 07:17
|
Частый гость
 
Группа: Свой
Сообщений: 137
Регистрация: 10-04-07
Из: г. Троицк
Пользователь №: 26 907

|
С фрагментацией разобрался,пакет передавался полностью, просто у меня фильтр снифера был настроен так, что не показывал остальные фрагменты. Цитата(kolobok0 @ Jan 27 2014, 00:27)  Для ускорения передачи, можно подкорректировать временные задержки. я сейчас на вскидку не помню названия, но на уровне сокетов есть такие настройки. Увы, ничего похожего в сокете не нашел  Цитата(kolobok0 @ Jan 27 2014, 00:27)  попробуйте сравнить скорость со стандартным пингом. пошлите те-же 14000 раз 100 и посмотрите картину по скорости. у меня с ноута задержки при стандартном пинге составляют порядка <=10 мкс между уходами пакетов. АРМ на порядок где то побольше = около 120 мкс. по памяти: всего пинг 7770 писюк-арм около <=2мс в среднем. Под "стандартным пингом" подразумевается команда "ping" командной строки? Так она отсылает пакеты примерно раз в секунду. Или имелось ввиду, что пинг реализовывать в своей пррограмме?
|
|
|
|
|
Feb 2 2014, 14:03
|
Частый гость
 
Группа: Свой
Сообщений: 137
Регистрация: 10-04-07
Из: г. Троицк
Пользователь №: 26 907

|
Цитата(kolobok0 @ Feb 1 2014, 00:05)  Вы каким нить ваиришаком или изереалом смотрите на времена запроса-ответа. с лева второй столбец - так и называется Time  то что раз в секунду - это понятно... Возможно, я Вас не совсем понял, но меня не интересует время между запросом и ответом, я вообще пока не жду никакого ответа. У меня беда в том, что КОМПЬЮТЕР МЕДЛЕННО отправляет UDP пакеты. To All: Так может мне все-таки кто-нибудь ответить, 700 мкс на передачу пакета функцией sendto()( при его, пакета, длительности порядка 15мкс) является нормальным временем? Если это нормально и есть особенность Winsock, я пойду каким-то другим путем. Если такого быть не должно, то я начну разбираться с причинами. Заранее спасибо.
|
|
|
|
|
Feb 2 2014, 18:49
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(b-volkov @ Feb 2 2014, 18:03)  Возможно, я Вас не совсем понял...... Вы и не пытались. Для тех кто в танке и ленится сойти, но продолжает орать от боли... Код BOOL val = TRUE; setsockopt(soc, IPPROTO_TCP, TCP_NODELAY, (const char*)&val, sizeof(val)); Правда это для TCP слоя. Для юдп - задержек не должно быть априори. что послал - то и убежало... да прибудут с вами знания...
Сообщение отредактировал kolobok0 - Feb 3 2014, 11:44
|
|
|
|
|
Feb 4 2014, 13:51
|
Частый гость
 
Группа: Свой
Сообщений: 137
Регистрация: 10-04-07
Из: г. Троицк
Пользователь №: 26 907

|
Цитата(krux @ Feb 2 2014, 18:26)  если у вас сделан просто цикл, то win его искуственно прерывает (для выполнения других задач) принудительный context switch производится со скоростью примерно 35 раз в секунду, даже если PC больше делать нечего.
про "700 мкс" вам никто ничего вразумительного не скажет поскольку много неизвестных. начиная от скорости процессора и заканчивая версией драйвера вашей сетевой карты, тем более что PC это не real-time система. PC то она мож и ралтайм... вот Винь... Но моя проблема не имеет отношения к "задумчивости" винды, поскольку задержки равномерно распределяются между всеми посылками, а быстродействия процессора хватает с запасом на несколко порядков. Как выяснилось, проблема имеет место на моем рабочем компе и еще одном очень похожем по конфигурации (на обоих Винь 7), но отсутствует на на трех ноутах (два ХР и 8-ка). На ноутах задержки на порядок меньше. Буду копать дальше, железо или ось.
|
|
|
|
|
Feb 18 2014, 01:57
|
Группа: Новичок
Сообщений: 2
Регистрация: 10-12-05
Пользователь №: 12 041

|
Уважаемый, b-volkov. Вы затронули весьма актуальную (по крайней мере для меня) тему!!! Дело в том, что я напоролся на те же "грабли". Та же "Вынь 7", прога с winsock, udpclient. Нужно управлять девайсом с большой скоростью, а UDP жутко тормозит.
Если Вы найдёте причину, не могли бы Вы поделиться тут решением этой проблемы?
Заранее благодарен.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|