UDP - это вполне жизнеспособный протокол. Это тот же самый старый пример правильного инструмента для правильной работы!
Если у вас есть программа, которая ждет датаграммы UDP, а затем уходит, чтобы обработать их, прежде чем возвращаться, чтобы ждать другого, то ваше прошедшее время обработки должно всегда быть быстрее, чем скорость поступления данных по наихудшему случаю дейтаграмм. Если это не так, то очередь приема UDP-сокетов начнет заполняться.
Это может быть допущено для коротких всплесков. Очередь делает именно то, что она должна делать - очереди дейтаграмм до тех пор, пока вы не будете готовы. Но если средняя скорость прибытия регулярно вызывает отставание в очереди, пришло время перепроектировать вашу программу. Здесь есть два основных варианта: сократить прошедшее время обработки с помощью коварных методов программирования и/или многопоточную вашу программу. Можно также использовать балансировку нагрузки для нескольких экземпляров вашей программы.
Как уже упоминалось, в Linux вы можете проверить файловую систему proc, чтобы получить информацию о том, что такое UDP. Например, если я cat
в /proc/net/udp
узел, я получаю что-то вроде этого:
$ cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
40: 00000000:0202 00000000:0000 07 00000000:00000000 00:00000000 00000000 0 0 3466 2 ffff88013abc8340 0
67: 00000000:231D 00000000:0000 07 00000000:0001E4C8 00:00000000 00000000 1006 0 16940862 2 ffff88013abc9040 2237
122: 00000000:30D4 00000000:0000 07 00000000:00000000 00:00000000 00000000 1006 0 912865 2 ffff88013abc8d00 0
От этого, я могу видеть, что сокет принадлежит идентификатор пользователя 1006, прослушивает порт 0x231D (8989), и что получают очередь составляет около 128 КБ. Поскольку 128 КБ является максимальным размером в моей системе, это говорит о том, что моя программа очень слаба, не отставая от прибывающих дейтаграмм. До сих пор было 2237 капель, а это означает, что уровень UDP не может помещать в очередь сокетов еще несколько дейтаграмм и должен их отбрасывать.
Вы можете наблюдать за поведением вашей программы с течением времени, например. с помощью:
watch -d 'cat /proc/net/udp|grep 00000000:231D'
Отметим также, что NetStat команда делает примерно то же самое: netstat -c --udp -an
Мое решение для моей Weenie программы, будет многопоточной.
Cheers!
Спасибо за rx_queue, для остальных - см. Обновление) –
@Juliano Кто сказал, что может выбрать протокол для использования? Возможно, он реализует протокол на основе udp для обслуживания существующих клиентов. – steffen
Плакат хочет знать о мониторинге статистики UDP, а не о мнениях по использованию протокола. Сначала определив, где происходит потеря в слоях, тогда можно работать с исправлением. – RickS