Как контролировать Linux, UDP буферизует свободное место?

У меня есть приложение Java на Linux, который открывает сокет UDP и ожидает сообщений.

После нескольких часов под большой нагрузкой существует потеря пакетов, т.е. пакеты получены ядром, но не моим приложением (мы видим потерянные пакеты в сниффере, мы видим пакеты UDP, потерянные в netstat, мы не видим те пакеты в наших журналах приложения).

Мы пытались увеличить буферы сокета, но это не помогло - мы начали терять пакеты позже затем прежде, но вот именно.

Для отладки я хочу знать, насколько полный ОС udp буфер в любой данный момент. Погугленный, но ничего не нашел. Можно ли помочь мне?

P.S. Парни, я знаю, что UDP ненадежен. Однако - мой компьютер получает все сообщения UDP, в то время как мое приложение не может использовать некоторые из них. Я хочу оптимизировать свое приложение к макс., это - причина вопроса.Спасибо.

47
задан Yoni Roit 19 February 2010 в 05:34
поделиться

1 ответ

Linux предоставляет файлы / proc / net / udp и / proc / net / udp6 , в которых перечислены все открытые сокеты UDP (для IPv4 и IPv6 соответственно). В обоих столбцах tx_queue и rx_queue показаны исходящие и входящие очереди в байтах.

Если все работает, как ожидалось, вы обычно не увидите никакого значения, отличного от нуля, в этих двух столбцах: как только ваше приложение генерирует пакеты, они отправляются через сеть, и как только эти пакеты прибывают из сети, ваше приложение проснется и получит их (немедленно возвращается вызов recv ). Вы можете увидеть увеличение rx_queue , если ваше приложение имеет открытый сокет, но не вызывает recv для получения данных, или если оно не обрабатывает такие данные достаточно быстро.

40
ответ дан 26 November 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: