lockLoadData /未缓存页面构建的目的是花一分钟左右的时间,用在usleep中


11

我认为自从Magento 2.3.1更新以来,我在开发过程中遇到了未缓存页面加载的问题。

我做了一个blackfire.io跟踪,结果发现这里的usleep花费了42秒。

现在我想知道这样做的目的是什么。我想我在某种比赛条件下跑步?

以前有人遇到过这样的事情吗?

编辑:调用堆栈似乎涉及Commercebug。

Answers:


8

那是一个选择?-Magento工程师制造的。

这不是一个答案,但是看起来该函数接受了旨在加载缓存数据的回调。回调函数检查当前是否有锁。如果没有,它将放置一个锁,加载数据,然后释放该锁。如果有适当的块,它将休眠100,000微秒(.1秒),然后再次调用加载程序。

所以,想一想,我的猜测是

  1. 对该功能的请求数量可能比正常数量多
  2. 从缓存中读取的时间比正常时间长。


7

lockedLoadData机制需要减少服务器上的负载。

以前,当在高负载站点上清除配置缓存时,所有客户端都会生成相同的信息,从而显着增加cpu / io负载。

使用lockedLoadData,只有一个客户端将生成缓存,而其他客户端将等待它。

有关其工作方式的更多详细信息。

第一个函数调用“获取数据”回调,如果它获取数据而不是返回数据(因此,如果数据在缓存中,则代码的工作方式与以前相同,并且不使用任何锁)。

如果数据不可用并且锁已锁定,则在循环中,我们尝试加载数据,直到数据将被获取或锁被删除为止。

如果没有锁,那么我们创建一个锁并生成数据,并将其保存在缓存中,然后删除该锁并返回数据

PS:我们将这些更改作为补丁发送给了一个负载高达20kRPM的客户端,并且至少可以工作3个月,没有任何问题。因此,可能是您的自定义/模块中的问题(例如,如果它们破坏了缓存机制)


有趣的是……无论如何,它还是疯了。我正在使用PulseStorm的艾伦(Alan)进行调试
亚历克斯(Alex)

似乎是一个非常糟糕的解决方案,这意味着所有等待的用户都将使他们的进程保持活动状态。.为什么他们不能仅使用表锁
OZZIE

@OZZIE,您是否希望所有用户都生成数据,而不是一直休眠直到完成?我们没有数学上可用的CPU资源
KAndy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.