我试图找出 PHP 没有消耗大量内存而是导致非常高的Committed_AS
结果的情况。
以这个 munin 内存报告为例:
一旦我启动了我们的 Laravel 队列(10 ~ 30 个工作人员),已提交的内存就会激增。我们在这个 vps 实例上有 2G 内存 + 2G 交换,到目前为止有大约 600M 未使用的内存(大约 30% 可用)。
如果我理解 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
我见过很多情况,高交换使用意味着内存不足,但我们的交换使用低,所以我不确定这里的故障排除步骤是合适的。
PS:在 Laravel 4.1 和我们的 vps 升级之前,我们没有这个问题,这里有一张图片来证明这一点。
也许我应该将我的问题改写为:如何准确计算 Committed_AS 以及 PHP 是如何影响它的?
2014.1.29 更新:
我对这个问题有一个理论:由于 laravel queue workersleep()
在等待队列中的新作业时实际上使用 PHP(在我的情况下beanstalkd
),这表明高Committed_AS
估计是由于相对较低的工作量和相对较高的内存消耗。
正如我所见,这是有道理的Committed_AS
~= avg. memory usage / avg. workload
。与 PHP 一样sleep()
,几乎没有使用 CPU;但是它消耗的任何内存仍然是保留的。这导致服务器思考:嘿,即使负载很小(平均),您也使用了这么多内存(平均),您应该为更高的负载做好更好的准备(但在这种情况下,更高的负载不会导致更高的内存脚印)
如果有人想测试这个理论,我很乐意将赏金奖励给他们。