Подтвердить что ты не робот

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 не показывает никаких показателей, которые предполагают, что существует проблема (если нет какой-либо метрики, я не понимаю правильно).

Любые предложения по диагностике этой причины?

4b9b3361

Ответ 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.