首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP 5.5,在什么情况下PHP会导致非常高的提交内存

PHP 5.5,在什么情况下PHP会导致非常高的提交内存
EN

Stack Overflow用户
提问于 2014-01-26 01:25:10
回答 3查看 1.1K关注 0票数 17

我正在尝试找出一种情况,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();但是它所消耗的内存仍然是保留的。这导致服务器思考:嘿,你使用了如此多的内存(平均),即使负载很小(平均),你应该为更高的负载做好更好的准备(但在这种情况下,更高的负载并不会导致更高的内存占用)

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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左右,这更加合理,并且在我们的总内存限制之内

票数 1
EN

Stack Overflow用户

发布于 2014-01-28 02:58:50

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

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

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

万事如意,你会需要它的!

票数 2
EN

Stack Overflow用户

发布于 2014-02-01 22:29:39

Committed_AS是内核实际承诺给进程的实际大小。而且queues是独立运行的,与PHPLaravel.无关。除了Rijndael所说的,我建议安装New Relic,它可以用来找出问题所在。

提示:我注意到使用NginX-HHVM组合可以极大地降低服务器负载。试试看。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21353706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档