У нас есть 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