CakeSession::_startSession - Elasticache 运行缓慢

CakeSession::_startSession - Slow on Elasticache

我们是 运行 CakePHP 2.9,并使用 Elasticache 集群进行会话存储(通过 Memcached 存储)。

我们已按照此处的建议禁用了 PHP 的内置会话垃圾收集功能: https://tideways.io/profiler/blog/php-session-garbage-collection-the-unknown-performance-bottleneck

session.gc_probability = 0

我们还在 CakePHP 的缓存配置中将 probability 设置设为 0。

但是;正如 New Relic 所报告的那样,我们仍然存在偶尔会在 CakeSession::_startSession 中遇到严重减速的问题:

Elasticache 集群没有显示任何表明存在问题的指标(除非有一些我没有正确理解的指标)。

关于如何诊断这个原因有什么建议吗?

需要解耦调试,找出是哪一层出了问题。

可以是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 集群上。

尝试指向节点的端点而不是 ElastiCache 集群的端点,让我知道进展如何。

这个问题似乎是由会话锁定引起的,我什至都不知道它的存在。

本文解释了会话锁定的存在方式和原因: https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/

重要的是 memcached 默认开启了会话锁定

在我们的例子中,除了身份验证之外,我们不使用会话,我们的应用程序不使用会话信息来存储用户状态(就像购物车那样),所以我们简单地禁用会话锁定php.ini 设置:

memcached.sess_locking = 0

自从进行此更改后,我们发现响应时间有了巨大改进(平均约 200 毫秒到约 160 毫秒)。这在同时加载大量数据的 AJAX-heavy 页面上尤其明显。以前似乎这些请求是按顺序加载的,但现在它们都是同时服务的,速度上的差异令人难以置信。

虽然由于关闭会话锁定,我们可能会在即将到来的 weeks/months 中发现一些边缘情况,但这似乎是问题的原因,并且此更改似乎已停止问题发生。

在将会话移动到 AWS 上的 Memcached(EC2 和 Elasticache/Memcached)后,我们遇到了类似的网站变慢的问题。以下更改解决了问题。

php.ini - session.lazy_write = Off
memcached.ini - memcached.sess_locking = Off

现在网站运行正常,速度符合预期。

但我想知道关闭这些设置是否有任何不利影响?