Назад | Перейти на главную страницу

Как измерить и минимизировать потерю UDP-пакетов

Я иногда сталкиваюсь с прерыванием голоса при звонке через приложение VOIP. Поскольку все приложения VOIP используют UDP для передачи данных, есть ли в Linux какой-либо инструмент для измерения количества потерянных пакетов и измерения производительности сети.

В чем может быть основная причина потери пакетов UDP и какие меры мне нужно предпринять, если потери пакетов очень велики?

Одна из основных причин потери UDP, особенно в локальных сетях, - это переполнение буфера. Это может произойти в коммутаторе, а также на отправляющем или принимающем серверах. Один из механизмов, который вы можете использовать в Linux для проверки потери пакетов, - это выполнить следующую команду:

watch -n 1 -d 'cat /proc/net/udp'

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

Every 1.0s: cat /proc/net/udp                                                                                                                                 Mon Sep 28 15:01:00 2015

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops
11362: 00000000:3443 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 18224 2 ffff880808040000 0
19543: 00000000:D438 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 3809742 2 ffff8808060c8400 0
30819: 00000000:0044 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 12644 2 ffff88100f2b0400 0

Затем вы можете попробовать несколько разных уловок, чтобы попытаться решить эти проблемы (снова используя Linux в качестве примера):

  • убедитесь, что у приложения, потребляющего данные, достаточно ЦП,
  • убедитесь, что потоки, выполняющие ввод-вывод, находятся как можно ближе к сетевому устройству
  • убедитесь, что все размеры буфера udp достаточно велики для размещения данных (опять же, вы можете посмотреть вывод команды watch, чтобы увидеть, tx_queue или rx_queue столбцы растут), а затем увеличьте буферы udp с помощью sudo sysctl -w 'net/ipv4/udp_mem=xxx yyy zzzz', или sysctl -w 'net/core/rmem_default=????', или sysctl -w 'net/core/wmem_default=????' (обратите внимание, xxx, yyyy, zzz определены Вот

В бессовестной саморекламе я создал продукт под названием Менеджер потоков Pontus Vision который постоянно настраивает это автоматически.

Что может быть общей причиной потери пакетов UDP

Перегрузка (слишком много пакетов) с отсутствием QOS (случайные пакеты отброшены, VoIP не обрабатывается с приоритетом) и / или неисправное оборудование (качество линии и т. Д.). Для первого получите оборудование с поддержкой QOS, для последнего проверьте линии (оборудование, переключатели, что угодно) за то, что он плохой.

Для подключения к Интернету вам потребуются маршрутизаторы QOS на обоих концах, которых у вас не будет (если ваш провайдер не предлагает VoIP, то у него, вероятно, есть инфраструктура). Тем не менее, поскольку ваш нисходящий канал обычно намного больше, чем восходящий канал, локальный маршрутизатор, отдающий приоритет только нисходящему каналу, обычно «достаточно хорош».

Однако плохое качество линии - это сложная проблема.

Если вы страдаете от потери пакетов UDP, вы почти наверняка страдаете также от потери пакетов TCP. Разница в том, что TCP будет повторно передавать потерянные пакеты, а UDP - нет. Приложения VoIP не могут повторно передавать, потому что, если бы они это сделали, информация больше не была бы полезной.

Я предполагаю, что ваши звонки VoIP проходят через Интернет. QoS может быть необходимо, но это не принесет никакой пользы, если ваше интернет-соединение не работает должным образом. Использовать это тест потери пакетов чтобы проверить это. Он сообщит вам, что происходит потеря пакетов, то есть у провайдера или на вашем локальном сайте.

Если он обнаружит проблемы на вашем местном объекте, то пора проверить ваш кабельный или DSL-модем на предмет хорошего отношения сигнал-шум, выходной мощности и затухания (DSL).