“Lost” UDP packets (JBoss + DatagramSocket)

I develop part of some JBoss+EJB based enterprise application. My module needs to process huge amount of incoming UDP packets. I've done some load testing and it looks that in case of sending packets with 11ms interval everything is fine, but in case of 10ms interval some packets are lost. It's rather strange in my opinion, but I done 10/11ms interval load tests comparison several times and it is always the same result (10 ms - some "lost" packets, 11ms - everything's fine).

If it was something wrong with synchronization, I'd expect that it will also be visible in case of 11ms tests (at least one packet lost, or at least one wrong counter value). Так что, если это не из-за синхронизации, возможно, DatagramSocket, через который я получаю пакеты, не работает должным образом.

Я обнаружил, что размер приемного буфера (SO_RCVBUF) имеет значение по умолчанию 57344 (вероятно, это зависит от используемых сетевых буферов ввода-вывода). Я подозреваю, что, возможно, когда этот буфер заполнится, новые входящие датаграммы UDP будут отклонены. Я попытался установить это значение немного выше, но заметил, что если я преувеличиваю, буфер возвращается к своему размеру по умолчанию. Если это зависит от базового уровня, как я могу узнать максимальный размер буфера для определенной ОС / сетевой карты на уровне JBoss?

Возможно ли, что это вызвано размером приемного буфера, или, может быть, значение 57344 достаточно велико для обработки большинства случаев? У вас есть опыт решения таких проблем?

Для моего DatagramSocket не установлен тайм-аут.

[Отредактировано] Мне приходится использовать UDP, потому что я получаю данные Cisco Netflow - это протокол, используемый сетевыми устройствами для отправки некоторой статистики трафика. Кроме того, я не могу влиять на формат отправляемых байтов (например, я не могу добавлять счетчики для пакетов и так далее). Не ожидается, что все пакеты будут обработаны (некоторые дейтаграммы могут быть потеряны), но я ожидаю, что обработаю большую часть пакетов. Во время тестов с интервалом 10 мс было потеряно около 30% пакетов.

Маловероятно, что медленная обработка вызывает эту проблему. В настоящее время одноэлементный компонент содержит ссылку на метод приема DatagramSocket, вызывающий в цикле. Когда пакет получен, он передается в очередь и обрабатывается выбранным из пула компонентом без сохранения состояния. "Фасадный" синглтон отвечает только за получение пакетов и передачу их на обработку (он не ждет события завершения обработки). Piotr

5
задан omnomnom 23 February 2011 в 19:15
поделиться