CakeSession:: _ startSession - Медленно на Elasticache
Мы запускаем CakePHP 2.9 и используем кластер Elasticache для хранения сеанса (который хранится через Memcached).
Мы отключили сборку мусора, встроенную в PHP, как рекомендуется здесь:
https://tideways.io/profiler/blog/php-session-garbage-collection-the-unknown-performance-bottleneck
session.gc_probability = 0
Мы также установили для параметра probability
значение 0 в конфигурации кэша CakePHP.
Тем не менее; у нас все еще возникают проблемы, из-за которых мы иногда сталкиваемся с серьезными замедлениями в CakeSession:: _ startSession, как сообщает New Relic:
![Медленный CakeSession:: _ startSession]()
Кластер Elasticache не показывает никаких показателей, которые предполагают, что существует проблема (если нет какой-либо метрики, я не понимаю правильно).
Любые предложения по диагностике этой причины?
Ответы
Ответ 1
Эта проблема, похоже, была вызвана блокировкой сеанса, чего я даже не подозревал.
В этой статье объясняется, как и почему существует Session Locking:
https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/
Важно то, что memcached включил блокировку сессии по умолчанию.
В нашем случае мы не используем сеансы для многих других, кроме аутентификации, наше приложение не использует информацию о сеансе для хранения состояния пользователя (например, корзины покупок), поэтому мы просто отключили блокировку сеанса с помощью php.ini
:
memcached.sess_locking = 0
С момента внесения этого изменения мы видим значительное улучшение времени отклика (~ 200 мс в среднем до 160). Это особенно заметно на тяжелых страницах AJAX, которые одновременно загружают множество данных. Раньше казалось, что эти запросы загружаются последовательно, однако теперь их обслуживают одновременно, разница в скорости невероятна.
Несмотря на то, что в ближайшие недели/месяцы мы можем выявить некоторые крайние случаи, в результате отключения сеансовой блокировки это, по-видимому, является причиной проблемы, и это изменение, похоже, остановило проблему от возникновения.
Ответ 2
Вам нужно отлаживать развязанный способ выяснить, какой слой вызывает проблемы.
Это может быть Cake, инфраструктура AWS, латентность сети...
Запустите этот небольшой PHP script и сообщите нам, сколько времени прошло.
// 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) ;
Если время в порядке, проблема будет Cake.
Однако, будучи честным здесь, я довольно уверен, что проблема в ElastiCache Cluster.
Попробуйте указать точку конечной точки node, а не конечную точку кластера ElastiCache, и дайте мне знать, как идет ti.