#java #linux #tcp #network-programming #ip
#java #linux #tcp #сетевое программирование #ip
Вопрос:
У меня есть приложение на основе сервлетов, работающее на tomcat (7.0.53), oracle jvm (1.7.x) и CentOS (6.5). Существует скрипт, который периодически «проверяет работоспособность» приложения, отправляя GET
ему запрос (каждые 10 секунд).
Я сталкиваюсь со следующей проблемой:
При нормальной (умеренной) нагрузке (~ 4k параллельных подключений) некоторые проверки работоспособности завершаются ошибкой с таймаутом подключения (примерно каждый 10-20-й запрос завершается ошибкой). Время ожидания соединения, настроенное на клиенте, составляет 120 секунд. Это происходит ТОЛЬКО при подключении к 127.0.0.1
(loopback), подключение к <IP>
реальному интерфейсу локальной сети ( eth0
) не имеет этой проблемы *. Итак:
curl <args> http://127.0.0.1:<port>
сбой,
curl <args> http://1.2.3.4:<port>
не сбой.
Запуск tcpdump
показывает, что серверная сторона не отправляет ответ SYN-ACK
в случае сбоя.
Примечание: Из любопытства я отключил поддержку IPv6 ( net.ipv6.conf.all.disable_ipv6 = 1
), и проблема исчезла. Раньше IPv6 не использовался, но IPv6 для интерфейса loopback ( lo
) был инициализирован, и приложение было привязано ко всем доступным интерфейсам ( 127.0.0.1
, ::1
и <IP>
). На eth
интерфейсе IPv6 вообще не был инициализирован.
Каковы возможные причины такого поведения?
Есть идеи по дальнейшему устранению этой проблемы?
Комментарии:
1. Если вы инициализируете IPv6 в eth0, возникает ли у вас такая же проблема при отправке проверки работоспособности в eth0?