PHP 5.5,在什么情况下 PHP 会导致非常高的提交内存
我试图找出一种情况,即PHP不会消耗大量内存,而是导致非常高的结果。Committed_AS
以这个munin内存报告为例:
一旦我启动了我们的Laravel队列(10~30名工人),承诺的记忆就会飙升。我们在这个vps实例上有2G mem + 2G交换,到目前为止,大约有600M未使用的内存(大约30%可用)。
如果我理解正确,这意味着在当前工作负载的情况下,99.9%保证没有问题,并且似乎表明我们需要将vps内存增加三倍才能安全。Committed_AS
out of memory
我试图将队列数量从30个减少到10个左右,但正如你所看到的,绿线相当高。
至于设置:Laravel 4.1启用了PHP 5.5 opcache。我们使用的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队列工作者在等待队列中的新作业时实际上使用PHP(在我的情况下),这表明高估计值是由于相对较低的工作负载和相对较高的内存消耗。sleep()
beanstalkd
Committed_AS
这是有道理的,正如我所看到的~=。由于PHP正确,很少甚至没有使用CPU;然而,无论它消耗什么内存,它仍然被保留。这会导致服务器思维:嘿,即使负载很小(平均),您也使用如此多的内存(平均),您应该为更高的负载做好更好的准备(但在这种情况下,更高的负载不会导致更高的内存占用)Committed_AS
avg. memory usage / avg. workload
sleep()
如果有人想测试这个理论,我很乐意将赏金授予他们。