Мы запускаем CakePHP 2.9 и используем Elasticache Cluster для хранения сессий (который хранится через Memcached).
Мы отключили встроенную сборку мусора в PHP, как рекомендовано здесь:
https://tideways.io/profiler/blog/php-session-garbage-collection-the-unknown-performance-bottleneck
session.gc_probability = 0
Мы также установили probability
установка 0 в настройках CachePHP Cache.
Тем не мение; у нас все еще есть проблемы, из-за которых иногда мы сталкиваемся с серьезными замедлениями в CakeSession :: _ startSession, как сообщает New Relic:
Elasticache Cluster не показывает никаких метрик, которые бы указывали на наличие проблемы (если нет метрики, которую я не правильно понимаю).
Любые предложения о том, как диагностировать эту причину?
Вы должны отладить в отлаженном виде, чтобы выяснить, какой слой вызывает проблемы.
Это может быть Cake, инфраструктура AWS, сетевая задержка …
Запустите этот небольшой скрипт PHP и сообщите нам, сколько времени это заняло.
// memcache
$m = microtime( true );
$memcache_obj = new Memcache;
$memcache_obj->connect('myhost.cache.amazonaws.com', 11211);
printf('%.5f', microtime( true ) - $m) ;
// memcached.
$time = microtime( true );
$m = new Memcached();
$m->addServer('<elasticache node endpoint>', 11211);
$m->set('foo', 100);
var_dump($m->get('foo'));
printf('%.5f', microtime( true ) - $time) ;
Если время в порядке, проблема будет торт.
Однако, честно говоря, я уверен, что проблема в ElastiCache Cluster.
Попробуйте указать и конечную точку узла, а не конечную точку ElastiCache Cluster, и дайте мне знать, как идет работа.
Эта проблема, по-видимому, была вызвана блокировкой сеанса, чего я даже не подозревал.
В этой статье объясняется, как и почему существует блокировка сеанса:
https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/
Важно то, что В memcached включена блокировка сеанса по умолчанию.
В нашем случае мы не используем Sessions для чего-то иного, кроме аутентификации, наше приложение не использует информацию о сеансе для хранения пользовательской среды (как в корзине), поэтому мы просто отключили блокировку сеанса с помощью php.ini
установка:
memcached.sess_locking = 0
После внесения этого изменения мы наблюдаем значительное улучшение времени отклика (в среднем ~ 200 мс до ~ 160). Это особенно заметно на AJAX-страницах, которые загружают много данных одновременно. Ранее казалось, что эти запросы загружались последовательно, однако теперь все они обслуживаются одновременно, разница в скорости невероятна.
Хотя, вероятно, есть некоторые крайние случаи, которые мы раскроем в ближайшие недели / месяцы в результате отключения блокировки сеанса, похоже, это является причиной проблемы, и это изменение, по-видимому, остановило возникновение проблемы.