Задержка сокета TCP / IP Java - застряла на уровне 50 мкс (микросекунд)? (используется для Java IPC)

Мы профилируем и профилируем наше приложение, чтобы максимально уменьшить задержку. Наше приложение состоит из 3 отдельных процессов Java, работающих на одном сервере, которые передают сообщения друг другу через сокеты TCP / IP.

Мы сократили время обработки в первом компоненте до 25 мкс, но мы видим, что TCP Запись сокета / IP (на localhost) в следующий компонент неизменно занимает около 50 мкс. Мы видим еще одно аномальное поведение, заключающееся в том, что компонент, который принимает соединение, может писать быстрее (т.е. <50 мкс). Прямо сейчас все компоненты работают <100 мкс, за исключением связи через сокеты.

Не будучи экспертом по TCP / IP, я не знаю, что можно сделать, чтобы это ускорить. Были бы доменные сокеты Unix быстрее? MemoryMappedFiles? какие еще механизмы могли бы быть более быстрым способом передачи данных от одного процесса Java к другому?

ОБНОВЛЕНИЕ 21.06.2011 Мы создали 2 тестовых приложения, одно на Java и одно на C ++, чтобы более тщательно протестировать TCP / IP и сравнить. Приложение Java использовало NIO (режим блокировки), а C ++ - библиотеку Boost ASIO tcp. Результаты были более или менее эквивалентными: приложение C ++ примерно на 4 мкс быстрее, чем Java (но в одном из тестов Java превзошла C ++). Кроме того, обе версии показали большую вариативность времени на сообщение.

Я думаю, мы согласны с основным выводом о том, что реализация с общей памятью будет самой быстрой. (Хотя мы также хотели бы оценить продукт Informatica, если он соответствует бюджету.)

10
задан Sam Goldberg 21 June 2011 в 14:15
поделиться