В Memcache заканчивается память для сеансов PHP

У меня есть веб-уровень в AWS, на котором работает Nginx+PHP-fpm, использующий memcache на ElastiCache для сеансов. За последние 6 месяцев или около того мы столкнулись с очень странной проблемой, когда каждые 6 недель или около того узлу ElastiCache не хватает памяти и он начинает вытеснять ключи, что приводит к тому, что некоторые пользователи теряют сеанс, выходят из системы и Конечно разочарованы и теряют свое место в приложении.

Я пробовал несколько вещей. Один из них использует модуль php-memcached в ini:

session.save_handler = memcached
session.save_path = "<aws elasticache dns:port>"

И да, я проверил, что URL-адрес save_path, который я на самом деле использую, верен и получает сетевые подключения. Я также проверил с помощью метрик CloudWatch, что узел кэша действительно получает сетевые подключения и данные.

Эта конфигурация не работала, поэтому я заменил ее менеджером сеансов Zend framework и обработчиком сохранения. Я проверил с помощью phpinfo(), что session.save_handler был установлен на user, а также проверил, что браузер получает правильный файл cookie, который я настроил в сеансе Zend.

Тем не менее, у нас та же проблема, что и на следующем снимке экрана CloudWatch:

показатели cloudwatch для узла memcache

Я полагаю, что вертикальные всплески в памяти связаны с очисткой кэшем памяти ключей с истекшим сроком действия, что, по-видимому, происходит каждые 24 часа. Самый последний (крайний справа) всплеск — это место, где я перезагрузил узел. Странно то, что каждый раз, когда он очищает ключи, он очищает недостаточно. В конечном итоге мы получаем тенденцию к снижению доступной памяти, что в какой-то момент приводит к тому, что память заканчивается, а memcache начинает вытеснять ключи.

Я не понимаю, в чем может быть проблема и что делать дальше, чтобы отладить. Есть предположения? Спасибо!


person talentedmrjones    schedule 17.02.2015    source источник


Ответы (1)


Это не ошибка, просто Memcached должен работать так. По самой природе кэша данные должны быть (относительно) эфемерными. Если у вашего текущего узла недостаточно памяти для поддержки всех значений, которые вы пытаетесь сохранить, у него нет другого выбора, кроме как вытеснить ключи. Если вы храните только сеансы и заполняете весь экземпляр кеша, лучшим вариантом будет увеличить размер вашего узла кеша (это много сессий!), или, в случае AWS, добавить еще один узел .

Если вы также храните другие данные на узле кеша, установите разумное время истечения срока действия для этих элементов, чтобы они периодически истекали и освобождали место.

Обновление: я также добавлю, если вам удобно использовать файлы cookie, наличие ограниченного по времени файла cookie для воссоздания прерванных сеансов также является хорошей заменой. Базового кода «Оставаться в системе» должно быть достаточно

person jpschroeder    schedule 13.03.2015