【问题标题】:Symfony2: Intermittent High Response Time/Slow SessionHandlerProxy::read() completionSymfony2:间歇性高响应时间/慢 SessionHandlerProxy::read() 完成
【发布时间】:2016-09-22 09:18:36
【问题描述】:

我看到来自 Symfony2 会话管理器组件的非常奇怪的行为。特别是 SessionHandlerProxy::read() 函数在我的生产环境中有时会很慢。

Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy::read

我在运行 Ubuntu 的 Amazon EC2 上使用 Apache2,并使用默认的 Symfony2 会话存储(不是 Redis 或类似的东西),但我想知道我是否应该这样做。我安装了 NewRelic 来跟踪我的交易,报告如下:

缓慢的响应是间歇性的,我没有注意到请求/分钟和缓慢的会话读取时间之间有任何明显的相关性。我被难住了,有什么想法可以尝试吗?

【问题讨论】:

  • I/O 吞吐量如何?本机处理程序是一个文件处理程序。
  • 感谢您的回复。不知道我明白你在问什么。本机会话处理程序将会话存储在本地文件中?那么与更快的请求相比,大量请求的 I/O 吞吐量会降低吗?
  • 默认情况下,PHP 中的会话存储在文件中。如果您在存储会话的驱动器上遇到异常数量的 I/O 操作,这可能会导致您所描述的行为。值得一试。
  • 谢谢awons,我看了一下I/O速率,在麻烦的时候它非常低——从来没有超过50 kb/s,一定是别的。
  • 恐怕有很多可能的原因,我们没有足够的洞察力来弄清楚那里发生了什么:(

标签: php symfony session response newrelic


【解决方案1】:

我在一个项目中遇到了类似的情况。当我们切换到 redis 进行会话处理时,我发现了它(我们已经切换回 PHP 的默认文件系统处理程序,问题仍然间歇性出现)。

可能发生的情况是 SessionHandlerProxy::read() 方法被锁定在会话之外,进程正在等待会话解锁。

会话锁定是一个好东西,因为它可以防止 php 中的race conditions。因此,可能发生的情况是另一个请求当前正在访问会话,并且没有尽可能立即释放它。我通过google fu skills 找到的解决方案会在您完成会话后立即调用 $session->save() 处理程序,该处理程序会调用 session_write_close() (这会为下一个请求解锁会话)。

我希望这会有所帮助!

Symfony API Documentation for Session:Save()

Here is the original stack overflow question(虽然是 5 年前)。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2014-01-27
    • 2011-07-31
    • 2014-11-01
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多