2016-06-13 2 views
0

У нас около 500 клиентов подключены к серверу RedHat ES 5 Linux. В последнее время происходит, что сервер по-прежнему содержит соединения с клиентами, которые были перезагружены без остановки приложения, которое общается с сервером раньше. Netstat на клиенте всегда возвращает только одно установленное соединение с сервером. После перезагрузки клиента связь выполняется по новому установленному соединению. Иногда на стороне сервера старое соединение закрывается, иногда оно остается в состоянии, установленном так, что у нас растет число установленных соединений с каждым клиентом. Поскольку различные клиентские операционные системы затронуты, я думаю, что это не проблема приложения, а одна из ОС Linux на сервере. Я пытался настроить значения изСлишком много постоянных TCP-соединений

  • net.ipv4.tcp_keepalive_time = 600
  • net.ipv4.tcp_keepalive_intvl = 10
  • net.ipv4.tcp_keepalive_probes = 9

без успеха. Также я попытался установить максимальное значение дескриптора файла с 1024 на 2048, но соединения все равно никогда не закрываются, даже после истечения времени ожидания TCP. Есть ли у кого-нибудь идея, что может вызвать это странное поведение?

ответ

1

Эти настройки позволяют вам настроить поведение keep-alive по умолчанию (, если включены keep-alives). Тем не менее, они не делают keep-alives автоматическими. Эта функция должна быть явно включена для каждой розетки через опцию сокета SO_KEEPALIVE.

Для получения более подробной информации см. http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/. Из раздела 3:

Помните, что поддержка keepalive, даже если она настроена в ядре, не является поведением по умолчанию в Linux. Программы должны запрашивать контроль keepalive для своих сокетов с использованием интерфейса setsockopt.

+0

Привет, Гил, спасибо за ваш ответ! Я думаю, что параметры keepalive работают только для соединений в состоянии TIMED_WAIT, но соединения остаются ESTABLISHED. Кажется, что сервер не получает сигнал, чтобы закрыть соединение, возможно, потому что клиент закрыт, прежде чем он сможет отправить FIN или что-то в этом роде. Но как я могу избежать этого? – Airogat

+0

№ Keepalives предназначены для отключения соединений в состоянии ESTABLISHED. Но вам нужно включить его. –

Смежные вопросы