【问题标题】:Magento + Varnish + Memcache: session_start() is very slowMagento + Varnish + Memcache:session_start() 非常慢
【发布时间】:2018-02-12 20:09:14
【问题描述】:

我们使用 Varnish 经营一家 Magento 商店。一切正常,除了以下问题:如果您打开商店页面,然后让浏览器打开很长时间,比如 12 到 24 小时,然后重新加载页面,页面加载速度非常慢(大约 15 秒)。

我们在 app/code/core/Mage/Core/Model/Session/Abstract.php 中的 start_session() 调用中找到了问题。此调用大约需要 15 秒。

我们使用 memcache(不是 memcached)进行会话管理。

我们在 Google 上搜索了很多,发现了很多关于缓慢会话启动的帖子,但没有关于这个特定问题的帖子。

有人可以帮忙吗?

提前非常感谢, 蒂尔曼

【问题讨论】:

  • 更正:文件是app/code/core/Mage/Core/Model/Session/Abstract/**Varien.php**(不是app/code/core/Mage/Core/Model/ Session/Abstract.php) - 抱歉

标签: php session magento memcached varnish


【解决方案1】:

我在 New Relic 上也看到了很多。

据我所知,有几个不同的原因,我对这个问题没有完全了解,但这是我最近一直在研究的问题。这是我的发现。

Magento、Locking 和 New Relic 中的会话

Magento 中的每个控制器操作都使用会话,无论是否需要。会话在 Mage_Core_Controller_Varien_Action::preDispatch 中急切地实例化

如果您启用了会话锁定,这意味着在请求期间您的会话将被锁定,直到请求完成。我还没有找到释放会话锁的代码,但我很确定它就在那里。

最终这意味着,如果您使用同一会话从一个位置向 Magento 控制器操作发出多个并发请求,您将不得不等待其中一些请求完成并解锁会话才能继续。我通常将此视为新遗物的缓慢事务,卡在 Mage_Core_Model_Session_Abstract_Varien::start 约 30 秒(我认为我的会话锁定等待超时)。

在我看来,这份关于 New Relic 的报告有多个缺点

减慢总平均响应时间,因为这些请求比原本应该的要慢。 New Relic 记录最慢事务的样本,如果我有性能瓶颈,例如需要 20 秒,如果相同的 URL 受到会话锁定超时的困扰,New Relic 不会自动为我报告它们。超时隐藏了有用的数据。 原因

我已经看到了一些常见的原因,无论如何都不是一个明确的清单

机器人

百度和 Yandex 之类的爬虫有点粗鲁,会攻击网站。它们从一个位置运行,触发大量请求,使用相同的会话,并触发会话锁定机制,因此在 New Relic 中显示缓慢的事务。

Ajax 调用 Magento 控制器操作

对于涂漆的网站,客户特定数据必须小心加载,一些网站通过使用 ajax 调用 Magento 后端来获取所需数据来管理这一点。我还看到一些网站使用 ajax 调用后端来获取特定于产品的信息,例如商品在销售时剩余的库存量。

如果单个页面在页面加载时触发对后端的多个 ajax 调用,它可能会触发会话锁定机制。对 Magento 后端的 ajax 调用越多,您遇到锁定的可能性就越大。

清漆 ESI

实际上和上面一样,除了它使用 Edge Side Includes 而不是使用 ajax 调用,这似乎是对后端的新调用。

我的计划

我还没有采取行动,所以它仍然是纯粹的理论,但这是我在接下来的几个月里打算做的事情。

我在 Mage Titans UK 2016 会议期间提出了这个问题,Fabrizio Branca 向我介绍了以下模块:https://github.com/AOEpeople/Aoe_BlackHoleSession

基于正则表达式,该模块将阻止机器人创建真正的会话,这样做的好处是不会触发会话锁定,并且您的会话资源不会被粗鲁的机器人破坏。机器人不应再污染您的 New Relic 读数。

对于在缓存页面上获取客户数据的 ajax/ESI 调用,我可以看到您无能为力。您需要访问会话才能检索客户特定数据。

但是,对于获取目录特定数据(例如有限库存)的 ajax/ESI 调用,我认为根本不需要在该请求上存在会话。我未来的计划是试用 Aoe_BlackHoleSession 模块的扩展,这样我就可以将对特定 URL 的请求视为无会话的。

我对 ESI 的内部结构不太熟悉,所以很遗憾我没有太多要评论的地方。

另一种选择

在会议期间,Fabrizio Branca 说他能够完全禁用会话锁定而不会产生任何不良影响,测试风险自负。

【讨论】:

  • 非常感谢您的回答,Abhinav!我们决定从 Memcache 切换到 Redis 作为会话存储,并关闭会话锁定。这似乎解决了问题。
  • @AbhinavKumarSingh - 这是一篇非常古老的帖子,但是当您逐字复制答案时,您确实应该归功于原始发帖人。 See the OP's answer on Magento Stack Exchange
猜你喜欢
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2014-06-27
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
相关资源
最近更新 更多