Привет,
Есть клиент/сервер прога которая использует UDP.
Даже при небольшой нагрузке часть пакетов теряется и моя цель - выяснить где теряются пакеты:
- в свиче
- в Виндовозном стеке
- в Виндовозном NIC драйвере и карточке
Как проще это узнать?
Спасибо,
Газиз
UDP lost packets
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- Gaziz
- Житель
- Сообщения: 944
- Зарегистрирован: 17 фев 2003, 15:57
- Откуда: Almaty-Toronto-Vancouver-Seattle
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
Re: UDP lost packets
если потери идут при небольшой нагрузке и при втом нет потери
обычных пингов, то проблемa в проге, которая получает UDP пакеты.
она не достаточно быстро вычитывает пакеты из сокетного буфера
или он недостаточно большого размера, чтобы корректно справлятcя
с traffic burst'ами
ps вероятность потери пакетов в свитче, в драйвере или в стеке на пути
в сокетный буфер - практически ноль, если там только не стоит какая
то уж совсем диковинная кривизна
обычных пингов, то проблемa в проге, которая получает UDP пакеты.
она не достаточно быстро вычитывает пакеты из сокетного буфера
или он недостаточно большого размера, чтобы корректно справлятcя
с traffic burst'ами
ps вероятность потери пакетов в свитче, в драйвере или в стеке на пути
в сокетный буфер - практически ноль, если там только не стоит какая
то уж совсем диковинная кривизна
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Re: UDP lost packets
пинги - ICMP, на уровень трансаорта не передаётся. Кроме того, размер по умолчанию (если не задавать -l xxxx) достаточно мал.ajkj3em писал(а):если потери идут при небольшой нагрузке и при втом нет потери
обычных пингов, то проблемa в проге, которая получает UDP пакеты.
По умолчанию буфер 8к (не проверял, на память говорю). Это достаточно много, чтобы кривая апликация успела вычитать при недобльшой нагрузке.ajkj3em писал(а): она не достаточно быстро вычитывает пакеты из сокетного буфера
или он недостаточно большого размера, чтобы корректно справлятcя
с traffic burst'ами
"traffic burst'ами " - у него вроде нет.
да почему... при большой нагрузке (60% пропускной способности циски и загрузки СПЮ сиски) может и потеряться. А при включенном спининг три мы наблюдали фризинг. Зависит. А вообще есть случаи, когда между потребителем и датафид провайдером пакеты теряются (редко правдо и при большой нагрузке).ajkj3em писал(а): ps вероятность потери пакетов в свитче, в драйвере или в стеке на пути
- Аман Ванкуверский
- Маньяк
- Сообщения: 2759
- Зарегистрирован: 18 окт 2005, 01:10
Re: UDP lost packets
убрать свич, кроссовером содинить два хостаGaziz писал(а):выяснить где теряются пакеты:
- в свиче
в обоих случаях (если под виндовозным стеком имеются в виду уровни вплоть до того, на котором работает аппликуха), при кривом стеке и/или драйвере карточки, пакеты должны теряться вне зависмости от аппликухи сидящей на выходе. проверка - запускаем простой UDP listener на таргете, пускаем в его сторону траффик, сравниваем кол-во отправленных/дошедших пакетов.Gaziz писал(а): - в Виндовозном стеке
- в Виндовозном NIC драйвере и карточке
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Re: UDP lost packets
1)Gaziz писал(а):Привет,
Есть клиент/сервер прога которая использует UDP.
Даже при небольшой нагрузке часть пакетов теряется и моя цель - выяснить где теряются пакеты:
- в свиче
- в Виндовозном стеке
- в Виндовозном NIC драйвере и карточке
Как проще это узнать?
Спасибо,
Газиз
Сбрось и посмотри статистику на свиче, если там прога позволяет
на сиско можещь 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
Вынужден (не) в первый раз согласицца (с) Странджер
с ктултху
Если пинг проходит нормально то есть нет неконтролируемых потерб в канале то скорее всего либо вы не слищком быстро читаете сокет либо мал его буффер.
(1) Увеличьте буффер приема типа:
тут мы выделили буффер достаточный для приема 4000 датаграмм размером по полтора кило.
Обратите внимание, что система может выделить меньге запрошенного - проверить можно функцией getsockopt с теми же параметрами
(2) недостаточная скорость вычитки - ну тут совет стандартный перейдите на асинхронную вычитку, что например для виндов означает использование io completion port с количеством рабочик тредов = СPUnum*2.
(3) исследуйте проблему написав простенький сервер и клиент обмениваюшихся датаграммами в вашей сети - увеличавайте на серевер скоростьи размер передваемых датаграм для измерения эффективности.
Все что знал (и даже чуть больше)
Всяческих удач.

Если пинг проходит нормально то есть нет неконтролируемых потерб в канале то скорее всего либо вы не слищком быстро читаете сокет либо мал его буффер.
(1) Увеличьте буффер приема типа:
Код: Выделить всё
int recvBufer = 4000*1500;
char buff[1500];
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (char*)&recvBufer, sizeof(int));
...
recv(socket, buf, sizeof(buf), 0);
Обратите внимание, что система может выделить меньге запрошенного - проверить можно функцией getsockopt с теми же параметрами
(2) недостаточная скорость вычитки - ну тут совет стандартный перейдите на асинхронную вычитку, что например для виндов означает использование io completion port с количеством рабочик тредов = СPUnum*2.
(3) исследуйте проблему написав простенький сервер и клиент обмениваюшихся датаграммами в вашей сети - увеличавайте на серевер скоростьи размер передваемых датаграм для измерения эффективности.
Все что знал (и даже чуть больше)
Всяческих удач.
- sobomax
- Маньяк
- Сообщения: 3699
- Зарегистрирован: 29 июн 2006, 22:53
- Откуда: Vancouver