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

2022-08-30 23:46:30

我试图找出一种情况,即PHP不会消耗大量内存,而是导致非常高的结果。Committed_AS

以这个munin内存报告为例:

munin memory

一旦我启动了我们的Laravel队列(10~30名工人),承诺的记忆就会飙升。我们在这个vps实例上有2G mem + 2G交换,到目前为止,大约有600M未使用的内存(大约30%可用)。

如果我理解正确,这意味着在当前工作负载的情况下,99.9%保证没有问题,并且似乎表明我们需要将vps内存增加三倍才能安全。Committed_ASout 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升级之前,我们没有这个问题,这里有一个图像可以证明这一点。

old munin memory

也许我应该把我的问题改写为:Committed_AS是如何精确计算的,PHP是如何考虑的?


2014.1.29 更新:

我对这个问题有一个理论:由于laravel队列工作者在等待队列中的新作业时实际上使用PHP(在我的情况下),这表明高估计值是由于相对较低的工作负载和相对较高的内存消耗。sleep()beanstalkdCommitted_AS

这是有道理的,正如我所看到的~=。由于PHP正确,很少甚至没有使用CPU;然而,无论它消耗什么内存,它仍然被保留。这会导致服务器思维:嘿,即使负载很小(平均),您也使用如此多的内存(平均),您应该为更高的负载做好更好的准备(但在这种情况下,更高的负载不会导致更高的内存占用)Committed_ASavg. memory usage / avg. workloadsleep()

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


答案 1

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

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

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

万事如意,您将需要它!


答案 2

我最近发现了这个高提交内存问题的根本原因:PHP 5.5 OPcache设置

事实证明,导致每个PHP进程保留更多的虚拟内存(可以在命令中的VIRT列中看到),从而导致Munin估计潜在的提交内存要高得多。opcache.memory_consumption = 256top

我们在后台运行的 laravel 队列的数量只会夸大问题。

通过建议的128MB(我们真的没有有效地使用所有这些256MB),我们将估计值减少了一半,再加上我们服务器上最近的RAM升级,估计值约为3GB,更合理,并且在我们的总RAM限制内opcache.memory_consumption


推荐