Диагностика потерь пакетов RTP/SIP на виртуальных интерфейсах IP-АТС
- Прерывание голоса (робот, заикание, пропадание слов) при отсутствии видимых потерь в локальной сети.
- Рост счетчиков
packet receive errorsиbuffer errorsв выводеnetstat -su. - Логи ядра фиксируют отбрасывание сетевых очередей (
drop_monitor,tc -s qdisc). - Высокий джиттер (Jitter > 30ms) при одновременной обработке более 100 активных RTP-потоков.
1. Проверка потерь и переполнения очередей сокетов ядра
# Анализ системной статистики сетевого стека UDP
netstat -su
# Проверка дропов на кольцевых буферах сетевого адаптера (Ring Buffers)
ethtool -S eth0 | grep -E "drop|overrun|miss|error"
# Мониторинг очередей сокетов в реальном времени
ss -u -a -n -p -m2. Тюнинг сетевого стека Linux под High-Load RTP (Sysctl)
Создайте файл конфигурации /etc/sysctl.d/99-voip-udp-tuning.conf:
# Максимальный и базовый размер буфера приема сокета UDP (в байтах) - 32MB
net.core.rmem_max = 33554432
net.core.rmem_default = 8388608
# Максимальный и базовый размер буфера отправки сокета UDP - 32MB
net.core.wmem_max = 33554432
net.core.wmem_default = 8388608
# Длина очереди входных пакетов перед передачей в стек ядра
net.core.netdev_max_backlog = 10000
# Размеры буферов для UDP (min, default, max в страницах памяти)
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384Примените настройки:
sysctl --system3. Увеличение Ring Buffers сетевой карты
Виртуальные сетевые адаптеры (VirtIO, VMXNET3) часто запускаются с минимальными буферами по умолчанию:
# Просмотр текущих и максимальных лимитов
ethtool -g eth0
# Установка максимума для очередей RX/TX
ethtool -G eth0 rx 4096 tx 40964. Оптимизация виртуализации и привязка прерываний (IRQ Affinity)
- Отключите энергосберегающие состояния CPU (C-States / P-States) на хосте гипервизора (настройка
Performance Mode). - Выделите виртуальной машине IP-АТС выделенные non-oversubscribed ядра CPU (CPU Pinning).
- Настройте демон
irqbalanceили вручную привяжите очереди прерываний vNIC к свободным ядрам.
Частые вопросы (FAQ)
Почему netstat -su показывает рост 'packet receive errors' при низкой загрузке CPU?
Служба телефонии (например, Asterisk) не успевает вычитывать входящие RTP фреймы из выделенного сокету буфера SO_RCVBUF до прихода следующей пачки данных, что вызывает мгновенное переполнение очереди и сброс пакетов на уровне ядра.
Как виртуализация KVM/VMware влияет на джиттер UDP в VoIP?
При оверселлинге vCPU виртуальная машина испытывает задержки планировщика (CPU Ready / Steal Time). Если vCPU приостанавливается даже на 20-30 мс, буфер UDP переполняется, а клиенты фиксируют выпадение пачек аудиофреймов.
Как проверить потери UDP на конкретном SIP-порту 5060?
Используйте ss: ss -ulpn '( sport = :5060 )'. Обратите внимание на колонки Recv-Q и Send-Q. Если Recv-Q постоянно не равен нулю, приложение блокируется и не успевает обрабатывать сигнальные сообщения.
Помогает ли включение Jumbo Frames для RTP-трафика?
Нет, VoIP использует микропакеты: полезная нагрузка кодека G.711 (20ms) составляет всего 160 байт + заголовки (всего около 214 байт). Jumbo Frames не дают преимуществ для RTP и могут привести к нежелательной фрагментации.