UDP lost packets

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Gaziz
Житель
Сообщения: 944
Зарегистрирован: 17 фев 2003, 15:57
Откуда: Almaty-Toronto-Vancouver-Seattle

UDP lost packets

Сообщение Gaziz »

Привет,

Есть клиент/сервер прога которая использует UDP.

Даже при небольшой нагрузке часть пакетов теряется и моя цель - выяснить где теряются пакеты:

- в свиче
- в Виндовозном стеке
- в Виндовозном NIC драйвере и карточке

Как проще это узнать?

Спасибо,
Газиз
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Re: UDP lost packets

Сообщение ajkj3em »

если потери идут при небольшой нагрузке и при втом нет потери
обычных пингов, то проблемa в проге, которая получает UDP пакеты.
она не достаточно быстро вычитывает пакеты из сокетного буфера
или он недостаточно большого размера, чтобы корректно справлятcя
с traffic burst'ами

ps вероятность потери пакетов в свитче, в драйвере или в стеке на пути
в сокетный буфер - практически ноль, если там только не стоит какая
то уж совсем диковинная кривизна
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Re: UDP lost packets

Сообщение vg »

ajkj3em писал(а):если потери идут при небольшой нагрузке и при втом нет потери
обычных пингов, то проблемa в проге, которая получает UDP пакеты.
пинги - ICMP, на уровень трансаорта не передаётся. Кроме того, размер по умолчанию (если не задавать -l xxxx) достаточно мал.
ajkj3em писал(а): она не достаточно быстро вычитывает пакеты из сокетного буфера
или он недостаточно большого размера, чтобы корректно справлятcя
с traffic burst'ами
По умолчанию буфер 8к (не проверял, на память говорю). Это достаточно много, чтобы кривая апликация успела вычитать при недобльшой нагрузке.
"traffic burst'ами " - у него вроде нет.
ajkj3em писал(а): ps вероятность потери пакетов в свитче, в драйвере или в стеке на пути
да почему... при большой нагрузке (60% пропускной способности циски и загрузки СПЮ сиски) может и потеряться. А при включенном спининг три мы наблюдали фризинг. Зависит. А вообще есть случаи, когда между потребителем и датафид провайдером пакеты теряются (редко правдо и при большой нагрузке).
Аватара пользователя
Аман Ванкуверский
Маньяк
Сообщения: 2759
Зарегистрирован: 18 окт 2005, 01:10

Re: UDP lost packets

Сообщение Аман Ванкуверский »

Gaziz писал(а):выяснить где теряются пакеты:

- в свиче
убрать свич, кроссовером содинить два хоста
Gaziz писал(а): - в Виндовозном стеке
- в Виндовозном NIC драйвере и карточке
в обоих случаях (если под виндовозным стеком имеются в виду уровни вплоть до того, на котором работает аппликуха), при кривом стеке и/или драйвере карточки, пакеты должны теряться вне зависмости от аппликухи сидящей на выходе. проверка - запускаем простой UDP listener на таргете, пускаем в его сторону траффик, сравниваем кол-во отправленных/дошедших пакетов.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Re: UDP lost packets

Сообщение vg »

Gaziz писал(а):Привет,

Есть клиент/сервер прога которая использует UDP.

Даже при небольшой нагрузке часть пакетов теряется и моя цель - выяснить где теряются пакеты:

- в свиче
- в Виндовозном стеке
- в Виндовозном NIC драйвере и карточке

Как проще это узнать?

Спасибо,
Газиз
1)
Сбрось и посмотри статистику на свиче, если там прога позволяет
на сиско можещь clear counters fa xxx а потом show interface fa xxxx
Если ошибок нет, то смотри прогу.
2)
Если ошибки есть помотри нехитрую netstat -s -p UDP и если и там оибое нет, то netstat -s -p IP. Этот тулз слегка глуповат с случае малтикаста . А так можно использовать.
3) если у тебя кривое серверное приложение netstat -a покажет возможно много лисенинг сокетов.

Если у тебя проезжает череp router, то там могут пакеты теряться на уровне IP( просто отбрасываться ), если пакет большой длины фрагментирован, а фрагментация на рутере запрещена (часто стоит по дефолту на лоу кост девайсах). Теряются такие пакеты вне заисимости от нагрузки. Это может быть, если ты смастерил прогу, которая запихивает дэйтаграмму больше 1500 байт а дальше это должно ехать за рутер до получателя. Это легко определить пропингав хост l- 1472 байт и более.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Вынужден (не) в первый раз согласицца (с) Странджер :) с ктултху
Если пинг проходит нормально то есть нет неконтролируемых потерб в канале то скорее всего либо вы не слищком быстро читаете сокет либо мал его буффер.

(1) Увеличьте буффер приема типа:

Код: Выделить всё

int recvBufer = 4000*1500;
char buff[1500];
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (char*)&recvBufer, sizeof(int));
...
recv(socket, buf, sizeof(buf), 0);
тут мы выделили буффер достаточный для приема 4000 датаграмм размером по полтора кило.

Обратите внимание, что система может выделить меньге запрошенного - проверить можно функцией getsockopt с теми же параметрами

(2) недостаточная скорость вычитки - ну тут совет стандартный перейдите на асинхронную вычитку, что например для виндов означает использование io completion port с количеством рабочик тредов = СPUnum*2.

(3) исследуйте проблему написав простенький сервер и клиент обмениваюшихся датаграммами в вашей сети - увеличавайте на серевер скоростьи размер передваемых датаграм для измерения эффективности.

Все что знал (и даже чуть больше)

Всяческих удач.
Аватара пользователя
sobomax
Маньяк
Сообщения: 3699
Зарегистрирован: 29 июн 2006, 22:53
Откуда: Vancouver

Сообщение sobomax »

Как самый простой вариант поставить виндовый вариант tcpdump и посмотреть. Если он пакеты будет получать все в то время когда апликуха только часть значит проблема где-то между ядром и апликухой (читай маленький буфер или кривой framework).

-Maxim
Ответить