Я разрабатываю часть некоторого корпоративного приложения на основе JBoss + EJB.Мой модуль должен обрабатывать огромное количество входящих пакетов UDP.Я провел нагрузочное тестирование, и похоже, что в случае отправки пакетов с интервалом 11 мс все нормально, но в случае интервала 10 мс некоторые пакеты теряются.Это довольно странно, на мой взгляд, но я несколько раз проводил сравнение нагрузочных тестов с интервалом 10/11 мс, и это всегда один и тот же результат (10 мс - некоторые «потерянные» пакеты, 11 мс - все хорошо).
Если эточто-то не так с синхронизацией, я ожидаю, что она также будет видна в случае тестов 11 мс (как минимум один потерянный пакет или хотя бы одно неверное значение счетчика).Так что, если это не из-за синхронизации, то, возможно, DatagramSocket, через который я получаю пакеты, работает не так, как ожидалось.
Я обнаружил, что размер буфера приема (SO_RCVBUF) имеет значение по умолчанию 57344 (возможно, это зависит от сетевых буферов ввода-вывода).Я подозреваю, что, возможно, когда этот буфер заполнится, новые входящие дейтаграммы UDP будут отклонены.Я попытался установить это значение немного выше, но я заметил, что если я преувеличиваю, буфер возвращается к размеру по умолчанию.Если это зависит от нижележащего уровня, как я могу узнать максимальный размер буфера для определенной ОС / сетевой карты на уровне JBoss?
Возможно ли, что это вызвано размером приемного буфера, или, может быть, значение 57344 достаточно велико для обработки большинства случаев?У вас есть опыт работы с такими проблемами?
На моем DatagramSocket не установлено время ожидания.Мои UDP-дейтаграммы содержат около 70 байтов данных (значение без заголовка дейтаграммы).
[отредактировано] Мне нужно использовать UDP, потому что я получаю данные Cisco Netflow - это протокол, используемый сетьюустройства для отправки статистики трафика.Кроме того, я не имею никакого влияния на формат отправленных байтов (например, я не могу добавить счетчики для пакетов и т. Д.).Не ожидается, что все пакеты будут обработаны (некоторые дейтаграммы могут быть потеряны), но я ожидаю, что обработаю большинство пакетов.Во время интервальных тестов 10 мс было потеряно около 30% пакетов.
Маловероятно, что медленная обработка вызывает эту проблему.В настоящее время одноэлементный компонент содержит ссылку на DatagramSocket, вызывающий метод приема в цикле.Когда пакет получен, он передается в очередь и обрабатывается выбранным из пула компонентом без сохранения состояния.Синглтон «Фасад» отвечает только за прием пакетов и передачу их на обработку (он не ожидает завершения обработки).
Заранее спасибо, Петр