我正在尝试找出一种情况,PHP不会消耗大量内存,但却会导致非常高的Committed_AS
结果。
以munin memory report为例:
只要我启动Laravel队列(10 ~ 30个工人),提交的内存就会达到顶峰。我们在这个vps实例上有2G内存+ 2G交换,到目前为止,大约有6亿未使用的内存(这大约是30%的空闲空间)。
如果I understand Committed_AS
是正确的,那么在当前的工作负载下,这意味着99.9%保证不会出现out of memory
问题,而且似乎建议我们需要将vps内存增加两倍才能保证安全。
我试图将队列数量从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是如何准确计算的,以及是如何纳入其中的?
2014.1.29更新的:
我有一个关于这个问题的理论:由于laravel queue worker在等待队列中的新作业(在我的例子中是beanstalkd
)时实际上使用PHP,这表明较高的Committed_AS
估计是由于相对较低的工作负载和相对较高的内存消耗。
这是有意义的,因为我看到了Committed_AS
~= avg. memory usage / avg. workload
。正确地说,PHP很少使用,甚至不使用sleep()
;但是它所消耗的内存仍然是保留的。这导致服务器思考:嘿,你使用了如此多的内存(平均),即使负载很小(平均),你应该为更高的负载做好更好的准备(但在这种情况下,更高的负载并不会导致更高的内存占用)
如果有人想测试这个理论,我很乐意给他们赏金。
发布于 2014-05-02 13:53:33
我最近找到了这个高提交内存问题的根本原因:PHP5.5 OPcache设置。
事实证明,设置opcache.memory_consumption = 256
会导致每个PHP进程保留更多的虚拟内存(可以在您的top
命令的VIRT列中看到),从而导致Munin估计的潜在提交内存要高得多。
我们在后台运行的laravel队列的数量只会夸大问题。
通过将opcache.memory_consumption
设置为recommended 128MB (我们实际上并没有有效地使用所有这些256MB ),我们已经将估计值减半,再加上我们服务器最近的内存升级,估计在3 3GB左右,这更加合理,并且在我们的总内存限制之内
发布于 2014-01-28 02:58:50
关于Committed_AS,您需要了解两件事:
如果这不是框架队列的先前迭代的问题,并且假设您没有将任何新的代码更改推送到生产环境,那么您将需要比较这两次迭代。也许可以启动另一个机器并运行一些测试。您还可以使用xdebug或zend_debugger分析应用程序,以发现代码本身可能的原因。另一个有用的工具是strace。
万事如意,你会需要它的!
发布于 2014-02-01 22:29:39
Committed_AS
是内核实际承诺给进程的实际大小。而且queues
是独立运行的,与PHP
或Laravel.
无关。除了Rijndael所说的,我建议安装New Relic,它可以用来找出问题所在。
提示:我注意到使用NginX-HHVM组合可以极大地降低服务器负载。试试看。
https://stackoverflow.com/questions/21353706
复制相似问题