Zend Framework — Memcache не хватает памяти для PHP-сессий

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

Я пробовал несколько вещей. Одним из них является использование модуля 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

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

Я в недоумении относительно того, в чем может быть проблема и что попробовать дальше в попытке отладить. Какие-нибудь мысли? Спасибо!

0

Решение

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]