CakeSession :: _ startSession — медленный на эластичности

Мы запускаем 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:

Slow CakeSession :: _ startSession

Elasticache Cluster не показывает никаких метрик, которые бы указывали на наличие проблемы (если нет метрики, которую я не правильно понимаю).

Любые предложения о том, как диагностировать эту причину?

17

Решение

Вы должны отладить в отлаженном виде, чтобы выяснить, какой слой вызывает проблемы.

Это может быть 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, и дайте мне знать, как идет работа.

0

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

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

В этой статье объясняется, как и почему существует блокировка сеанса:
https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/

Важно то, что В memcached включена блокировка сеанса по умолчанию.

В нашем случае мы не используем Sessions для чего-то иного, кроме аутентификации, наше приложение не использует информацию о сеансе для хранения пользовательской среды (как в корзине), поэтому мы просто отключили блокировку сеанса с помощью php.ini установка:

memcached.sess_locking = 0

После внесения этого изменения мы наблюдаем значительное улучшение времени отклика (в среднем ~ 200 мс до ~ 160). Это особенно заметно на AJAX-страницах, которые загружают много данных одновременно. Ранее казалось, что эти запросы загружались последовательно, однако теперь все они обслуживаются одновременно, разница в скорости невероятна.

Хотя, вероятно, есть некоторые крайние случаи, которые мы раскроем в ближайшие недели / месяцы в результате отключения блокировки сеанса, похоже, это является причиной проблемы, и это изменение, по-видимому, остановило возникновение проблемы.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector