Периодические сбои при подключении к 127.0.0.1, отсутствие сбоев при подключении к IP (eth0)

#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?