У меня есть java-приложение, которое использует несколько экземпляров MulticastSocket для прослушивания
нескольких многоадресных UDP-каналов. Каждый такой сокет обрабатывается выделенным потоком.
Поток читает каждую Datagram, разбирает ее содержимое и записывает в журнал (log4j) порядковый номер пакета (long) и временную метку, когда Datagram была получена.
Когда я пытаюсь запустить 2 экземпляра одного и того же приложения на Windows Server 2008 R2, с 2 * 6 ядрами и сравнить два журнала, созданные двумя приложениями, я замечаю, что довольно часто время получения пакетов не совпадает.
Большинство пакетов принимается двумя приложениями в одно и то же время (milis), но часто разница между временем приема одного и того же пакета составляет около 1-7 мс. двумя приложениями.
Я попробовал выделить больше буферов в сетевой карте, а также сделал буфер чтения сокета больше. Кроме того, я пробовал минимизировать количество запусков GC, а также использовал -verbose:gc и могу видеть что время GC и проблемная разница во времени не происходят в одно и то же время. Это позволяет мне предположить, что моя проблема не связана с GC.
Проблем с отбрасыванием пакетов не наблюдалось, и проблема с пропускной способностью маловероятна.
Идеи / мнения приветствуются. Спасибо.