蛋糕会话::_startSession - 弹性松弛慢

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

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

session.gc_probability = 0

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

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

Slow CakeSession::_startSession

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

关于如何诊断此病因的任何建议?


答案 1

此问题似乎是由会话锁定引起的,我甚至不知道存在此问题。

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

重要的是,默认情况下,memcached 打开了会话锁定

在我们的例子中,除了身份验证之外,我们没有将会话用于其他用途,我们的应用程序不使用会话信息来存储用户状态(就像购物车一样),因此我们只是通过以下设置禁用了会话锁定:php.ini

memcached.sess_locking = 0

自进行此更改以来,我们看到响应时间有了巨大的改善(平均为约200ms至~160)。这在同时加载大量数据的 AJAX 密集型页面上尤其明显。以前,这些请求似乎是按顺序加载的,但是现在它们都是同时提供服务的,速度的差异令人难以置信。

虽然由于关闭会话锁定,我们可能会在未来几周/几个月内发现一些边缘情况,但这似乎是问题的原因,并且此更改似乎阻止了问题的发生。


答案 2

您需要以解耦方式进行调试,以找出导致问题的层。

它可以是蛋糕,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的端点,并让我知道ti如何去。


推荐