Как избавиться от задержки отправки tcp-ip при межпроцессном взаимодействии между Java и процессом php в виртуальных машинах KVM - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть веб-приложение, которое состоит из Java-части и PHP-части.Когда пользователь делает запрос, процесс php откроет соединение tcp / ip с процессом java.Это соединение будет оставаться открытым в течение всего времени запроса, и это соединение будет использоваться для отправки большого количества информации туда и обратно.Это приложение работает очень хорошо, если оно размещено на выделенном сервере или на виртуальной машине, использующей OpenVZ.

Как только я пытаюсь разместить его на виртуальной машине KVM, он становится очень медленным.Причина этого заключается в том, что в рамках одного пользовательского запроса процесс php может легко выполнить до 1 или 2 тысяч tcp-ip-запросов в процесс java.Теперь, поскольку все это выполняется по одному и тому же соединению, это действительно не должно быть проблемой, но на виртуальных машинах KVM кажется, что каждая отправка получает задержку около 20 миллисекунд, поэтому теперь запрос, который обычно занимает 0,1 секунды, вместо этого занимает 20 секунд.

Я не на 100% уверен, что виноват KVM, но я проверил это на 3 разных провайдерах хостинга, использующих OpenVZ, и еще 3х разных провайдерах хостинга, использующих KVM.Он отлично работает на всех хостах OpenVZ, и проблема задержки отправки присутствует на всех хостах KVM.

O, и у меня установлена ​​tcpnodelay как на стороне java, так и на стороне php.

AnyИдея, что я мог бы попытаться сделать эту работу на KVM?

1 Ответ

0 голосов
/ 24 апреля 2019

Итак, чтобы ответить на мой собственный вопрос.Кажется, что вам не удастся избежать задержки передачи, так как, несмотря на то, что на локальном хосте ему все же нужно перейти с уровня виртуализации на сетевой уровень и выполнить резервное копирование.

Однако вместо создания сокетов TCPна локальном хосте решение состояло в том, чтобы вместо этого использовать сокеты Unix.Так как сокеты Unix не имеют никакого доступа к сетевому уровню.

И в качестве бонуса Использование Unix-сокетов вместо TCP-сокетов дало моему приложению хороший прирост производительности.В том числе в настройках, где раньше все работало нормально.

...