2017-02-20 7 views
17

Мы запускаем CakePHP 2.9 и используем кластер Elasticache для хранения сеанса (который хранится через Memcached).CakeSession :: _ startSession - Slow on Elasticache

У нас коллекция сессии мусора инвалидов.Насладиться РНР встроенных в соответствии с рекомендацией здесь: https://tideways.io/profiler/blog/php-session-garbage-collection-the-unknown-performance-bottleneck

session.gc_probability = 0

Мы также устанавливают probability установки на 0 в пределах кэша конфигурации CakePHP в.

Однако; мы по-прежнему возникают проблемы при этом время от времени мы испытываем серьезные притормаживаний в CakeSession :: _ startSession, как сообщает New Relic:

Slow CakeSession::_startSession

Кластер Elasticache не показывает каких-либо показателей, которые бы предполагать, что существует проблема (если нет какой-то метрики, я не понимаю правильно).

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

+0

Являются ли веб-серверы теми же VPC, что и ElasticCache? – apokryfos

+0

@apokryfos Да - все в пределах одной группы безопасности - это то, что вы имели в виду? – user984976

+0

Нет VPC - это не то же самое, что и группа securty. VPC подобен локальной сети для служб. Проверьте [страницы faq out] (http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Introduction.html) – apokryfos

ответ

0

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

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

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

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

memcached.sess_locking = 0

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

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

0

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

Это может быть торт, AWS инфраструктуры, латентность сети ...

Выполнить этот небольшой скрипт, и сказать нам, сколько времени потребовалось.

// 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.

Попробуйте указать точку конечной точки и ее конечную точку, а не конечную точку кластера ElastiCache, и дайте мне знать, как идет ti.

+0

«Memcache» не установлен, только «Memcached» - знаете ли вы, как выполнить это с помощью Memcached? – user984976