CakeSession :: _ startSession - Elasticache

时间:2017-02-20 00:02:01

标签: php session cakephp memcached amazon-elasticache

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

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

session.gc_probability = 0

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

然而;我们仍然遇到问题,偶尔我们会遇到CakeSession :: _ startSession的重大减速问题,正如New Relic报道的那样:

Slow CakeSession::_startSession

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

有关如何诊断此原因的任何建议?

3 个答案:

答案 0 :(得分:0)

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

可能是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群集的终点,让我知道ti的用途。

答案 1 :(得分:0)

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

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

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

在我们的情况下,除了身份验证之外,我们不会使用Sessions,我们的应用程序不会使用会话信息来存储用户状态(就像购物车一样),所以我们只是禁用会话锁定使用php.ini设置:

memcached.sess_locking = 0

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

虽然可能会出现一些边缘情况,但由于关闭会话锁定,我们将在未来几周/几个月内发现,这似乎是问题的原因,而这种变化似乎已经解决了问题从发生。

答案 2 :(得分:0)

在将会话移至AWS上的Memcached(EC2和Elasticache / Memcached)后,我们遇到了类似的问题,即站点变慢。经过更改后,问题得以解决。

android {

//........
flavorDimensions "version"
productFlavors {
    Free {
        dimension "version"
        applicationId "com.exampleFree.app"
    }
    Paid {
        dimension "version"
        applicationId "com.examplePaid.app"
    }
}

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def appId = variant.applicationId// com.exampleFree.app OR com.examplePaid.app
        def versionName = variant.versionName
        def versionCode = variant.versionCode // e.g 1.0
        def flavorName = variant.flavorName // e. g. Free
        def buildType = variant.buildType.name // e. g. debug
        def variantName = variant.name // e. g. FreeDebug

        //customize your app name by using variables
        outputFileName = "${variantName}.apk"
    }
}}

现在该站点可以正常运行,并且速度可以预期。

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