为什么我的内存使用逐渐增加?

Why is my memory used gradually increasing?

有点迷失在 topfree -m 的世界里,我想知道是否有人可以阐明我所看到的。

我们有一个 PHP 应用构建 Laravel。最近,我们添加了一些队列和一个处理程序来处理该队列上的项目。为此,我们安装了 supervisord 并且我们正在 运行ning queue:listen,一个内置于 Laravel 的命令,基本上 运行 是一个 PHP 脚本无限处理项目。

注意: 我很清楚 PHP 不是最好的解决方案。时间限制、现有技术等,都是我们选择走这条路的原因。

我昨天将它部署到我们的登台服务器,当我今天登录时,我们的监控警告说盒子上的 "used memory" 现在超过 90%(昨天安装前是 ~20%) .我从过去的经验中知道这不是一件坏事。使用的内存可能只是缓存 and/or 缓冲区,但在登录到该框后我开始怀疑它不是。例如,htop 表示大部分内存是 "used"(绿色条)。

有点卡住了,我重新启动了盒子。当它恢复正常并且一切正常 运行ning 时,它使用了大约 15% 的内存。一个小时后,这高达 25%。再次查看 htop,我看到这是使用的,没有缓存。

然后我进入了我们的一个没有最新更改的生产盒进行比较,那个盒有相同的缓存百分比,但使用率要低得多,与我在暂存中看到的相匹配。只要 运行ning.

,它就使用了大约 15% 的内存

然后我通过停止 supervisord 来停止 PHP 进程,并且使用的内存略微下降,但下降幅度不大。我假设这可能只是缓存?

我完全知道我可能误解了这里的某些内容,但这让我感到担忧。我不想 运行 这个过程,如果有东西正在吃 and/or 内存泄漏到系统将开始分页的程度。我只是想了解 为什么 我们的内存使用量正在缓慢增加,所以我知道这不是什么值得担心的事情,或者我可以解决它。

谢谢。

编辑

有趣的是,我们实际上在 2 个相同的 AWS 机器上看到了这一点,一个是测试服务器,另一个是暂存服务器。碰巧的是,我同时重新启动了两者,但是一个(暂存)的进程停止了 30 分钟,而另一个是 运行 non-stop。

这就是两者在htop中的区别,

暂存(处理 运行ning 比测试少 30 分钟):

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                         
 5763 webapp    20   0  538m  37m  12m S  0.0  1.8   0:00.23 php                                                                              
 5497 webapp    20   0  448m  29m  10m S  0.0  1.5   0:00.61 php

测试:

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                        
 4771 webapp    20   0  690m  47m  31m S  0.0  2.4   0:00.31 php                                                                            
 4660 webapp    20   0  603m  39m  27m S  0.0  2.0   0:00.36 php   

在两个列表中,second/bottom php 过程是由 supervisord 启动的漫长 运行ning 过程。 first/top 一个是由第二个创建的,运行 30 秒后被终止。本质上 Laravel 的排队系统轮询队列 (?!)。

有趣的是,测试盒上的所有 MEM 数字都更高,但我觉得奇怪的是 child 的 php 过程 MEM 数字也更高。由于每 30 秒启动和停止一次,我希望两个盒子上的情况相同。除非它实际上是主进程的一个分支?

我建议安装memmon,它是一个监控工具,非常好用而且轻巧。你可以用这个命令安装它

wget http://proj.ri.mu/installmemmon.sh -q -O - | bash && touch /var/log/memmon.txt && chmod 666 /var/log/memmon.txt

这只是一个脚本,每 5 分钟执行一次,日志转到 /var/log/memmon.txt,从那里您可以看到哪个进程占用了更多内存。

你也可以使用Vmstat

vmstat -s -S M

此命令以更详细的方式打印可用和已用内存,您可以使用此命令将此命令添加到 memmon 脚本中

echo "vmstat -s -S M" >> /usr/local/bin/memmon.sh

为了测试记忆你可以做的是这个

/usr/local/bin/memmon.sh >> /var/log/memmon.txt

根据Diego Velez的回答,我弄明白了这是什么。

supervisordphp 没有做错任何事,不管引用的数字是否相反。原来我找不到内存去向的原因是因为它作为 slab 分配由内核拥有。

谢天谢地,虽然都是 SReclaimable。具有讽刺意味的是,如果我今天不检查服务器并开始调试,我会看到内存使用量增加,然后在重新分配到 90% 左右时稳定下来。

事实证明,slab 分配的原因是 dentry 由 libcurl 中的错误引起的缓存。 This article 最终让我找到了解决方案。