gpt4 book ai didi

PHP 5.5,什么情况下PHP会导致committed memory很高

转载 作者:IT王子 更新时间:2023-10-29 00:13:30 25 4
gpt4 key购买 nike

我试图弄清楚 PHP 没有消耗大量内存而是导致非常高的 Committed_AS 结果的情况。

以这个 munin 内存报告为例:

munin memory

一旦我启动我们的 Laravel 队列(10 ~ 30 名工作人员),提交的内存就会暴增。我们在这个 vps 实例上有 2G 内存 + 2G 交换空间,到目前为止还有大约 600M 未使用的内存(大约有 30% 空闲)。

如果我understand Committed_AS 正确,这意味着 99.9% 保证在当前工作负载下不会出现 out of memory 问题,这似乎表明我们需要将 vps 内存增加三倍以确保安全.

我尝试将队列数量从 30 个减少到 10 个左右,但正如您所见,绿线非常高。

至于设置:启用了 PHP 5.5 opcache 的 Laravel 4.1。我们使用 spawn 实例的 upstart 脚本如下:

instance $N

exec start-stop-daemon --start --make-pidfile --pidfile /var/run/laravel_queue.$N.pid --chuid $USER --chdir $HOME --exec /usr/bin/php artisan queue:listen -- --queue=$N --timeout=60 --delay=120 --sleep=30 --memory=32 --tries=3 >> /var/log/laravel_queue.$N.log 2>&1

我见过很多情况,高 swap 使用意味着内存不足,但我们的 swap 使用率很低,所以我不确定这里的故障排除步骤是什么。

PS:在 Laravel 4.1 和我们的 vps 升级之前,我们没有这个问题,这里有一张图片来证明这一点。

old munin memory

也许我应该将我的问题改写为:Committed_AS 是如何准确计算的以及 PHP 如何将其纳入其中?


2014.1.29 更新:

我对这个问题有一个理论:因为 laravel 队列 worker 在等待来自队列的新作业时实际上使用 PHP sleep()(在我的例子中是 beanstalkd),它会建议高 Committed_AS 估计是由于相对较低的工作负载和相对较高的内存消耗。

这是有道理的,因为我看到 Committed_AS ~= avg。内存使用/平均。工作量。当 PHP sleep() 正确时,几乎不使用 CPU;但是它消耗的任何内存仍然保留。这导致服务器思考:嘿,即使负载最小(平均),你也使用了这么多内存(平均),你应该为更高的负载做好更好的准备(但在这种情况下,更高的负载不会导致在更高的内存占用中)

如果有人想测试这个理论,我很乐意将赏金奖励给他们。

最佳答案

关于 Committed_AS,您需要了解两件事,

  1. 这是一个估计值
  2. 它暗示了在最坏的情况下(加上交换)您需要多少内存。这取决于您当时的服务器工作量。如果您的工作负载较低,则 Committed_AS 会较低,反之亦然。

如果这不是框架队列先前迭代的问题,并且假设您没有将任何新的代码更改推送到生产环境,那么您将需要比较这两个迭代。也许旋转另一个盒子并运行一些测试。您还可以使用 xdebug 或 zend_debugger 分析应用程序,以发现代码本身的可能原因。另一个有用的工具是 strace。

祝一切顺利,您将需要它!

关于PHP 5.5,什么情况下PHP会导致committed memory很高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com