Назад | Перейти на главную страницу

Что могло заставить не очень загруженный сервер Redis закрыть соединение?

У нас есть 17k tcp-соединение в состоянии ЗАКРЫТИЕ на сервере Redis. Я понимаю, что только клиент будет инициировать закрытие соединения, а не с сервера Redis. Итак, я должен увидеть 0 соединений в состоянии ЗАКРЫТИЕ на сервере Redis. Кто-нибудь имеет опыт и знает первопричину?

Фактический номер соединения в 'redis-cli info' меньше 200, и у нас более чем достаточно памяти, а время простоя процессора составляет более 90%.

Я просмотрел Redis Doc на http://redis.io/topics/clients. Ни один из пунктов не помог мне найти первопричину.

redis version: 2.6.7

netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
  1 CLOSE_WAIT
  16980 CLOSING
  128 ESTABLISHED
  21 LAST_ACK
  12 LISTEN
  1 SYN_RECV

Это вызвано библиотекой phpredis, которую мы используем для подключения к серверу redis.

Обычно phpredis отправляет QUIT команда, чтобы попросить сервер Redis закрыть соединение. Но сразу после этого phpredis закрывает сам сокет tcp, в результате чего обе стороны пытаются закрыть соединение. Поэтому на сервере так много подключений, CLOSING штат.

Я создал простое решение этой проблемы. https://github.com/phpredis/phpredis/issues/562