Страница 1 из 1
UDP lost packets
Добавлено: 02 апр 2007, 12:52
Gaziz
Привет,
Есть клиент/сервер прога которая использует UDP.
Даже при небольшой нагрузке часть пакетов теряется и моя цель - выяснить где теряются пакеты:
- в свиче
- в Виндовозном стеке
- в Виндовозном NIC драйвере и карточке
Как проще это узнать?
Спасибо,
Газиз
Re: UDP lost packets
Добавлено: 02 апр 2007, 13:34
ajkj3em
если потери идут при небольшой нагрузке и при втом нет потери
обычных пингов, то проблемa в проге, которая получает UDP пакеты.
она не достаточно быстро вычитывает пакеты из сокетного буфера
или он недостаточно большого размера, чтобы корректно справлятcя
с traffic burst'ами
ps вероятность потери пакетов в свитче, в драйвере или в стеке на пути
в сокетный буфер - практически ноль, если там только не стоит какая
то уж совсем диковинная кривизна
Re: UDP lost packets
Добавлено: 02 апр 2007, 17:31
vg
ajkj3em писал(а):если потери идут при небольшой нагрузке и при втом нет потери
обычных пингов, то проблемa в проге, которая получает UDP пакеты.
пинги - ICMP, на уровень трансаорта не передаётся. Кроме того, размер по умолчанию (если не задавать -l xxxx) достаточно мал.
ajkj3em писал(а):
она не достаточно быстро вычитывает пакеты из сокетного буфера
или он недостаточно большого размера, чтобы корректно справлятcя
с traffic burst'ами
По умолчанию буфер 8к (не проверял, на память говорю). Это достаточно много, чтобы кривая апликация успела вычитать при недобльшой нагрузке.
"traffic burst'ами " - у него вроде нет.
ajkj3em писал(а):
ps вероятность потери пакетов в свитче, в драйвере или в стеке на пути
да почему... при большой нагрузке (60% пропускной способности циски и загрузки СПЮ сиски) может и потеряться. А при включенном спининг три мы наблюдали фризинг. Зависит. А вообще есть случаи, когда между потребителем и датафид провайдером пакеты теряются (редко правдо и при большой нагрузке).
Re: UDP lost packets
Добавлено: 02 апр 2007, 17:54
Аман Ванкуверский
Gaziz писал(а):выяснить где теряются пакеты:
- в свиче
убрать свич, кроссовером содинить два хоста
Gaziz писал(а):
- в Виндовозном стеке
- в Виндовозном NIC драйвере и карточке
в обоих случаях (если под виндовозным стеком имеются в виду уровни вплоть до того, на котором работает аппликуха), при кривом стеке и/или драйвере карточки, пакеты должны теряться вне зависмости от аппликухи сидящей на выходе. проверка - запускаем простой UDP listener на таргете, пускаем в его сторону траффик, сравниваем кол-во отправленных/дошедших пакетов.
Re: UDP lost packets
Добавлено: 02 апр 2007, 17:59
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 байт и более.
Добавлено: 03 апр 2007, 14:23
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) исследуйте проблему написав простенький сервер и клиент обмениваюшихся датаграммами в вашей сети - увеличавайте на серевер скоростьи размер передваемых датаграм для измерения эффективности.
Все что знал (и даже чуть больше)
Всяческих удач.
Добавлено: 03 апр 2007, 16:41
sobomax
Как самый простой вариант поставить виндовый вариант tcpdump и посмотреть. Если он пакеты будет получать все в то время когда апликуха только часть значит проблема где-то между ядром и апликухой (читай маленький буфер или кривой framework).
-Maxim