【问题标题】:Why is my memory used gradually increasing?为什么我的内存使用量逐渐增加?
【发布时间】:2015-04-07 16:20:03
【问题描述】:

迷失在topfree -m 的世界里,我想知道是否有人能对我所看到的有所了解。

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

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

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

有点卡住了,我重新启动了盒子。当它重新启动并且一切都在运行时,它有大约 15% 的已用内存。一个小时后,这一比例高达 25%。再次查看htop,我看到这是使用的,而不是缓存的。

然后,我进入了我们的一个没有最新更改的生产盒进行比较,该盒具有相同的缓存百分比,但使用率要低得多,与我在暂存时看到的相匹配。只要它一直在运行,它就有大约 15% 的已用内存。

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

我完全清楚我可能在这里误解了一些东西,但这让我有理由担心。如果某些东西正在消耗和/或内存泄漏到系统将开始分页的程度,我不想运行此过程。我只是想了解为什么我们的内存使用量正在缓慢增加,所以我知道这不是什么值得担心的事情,或者我可以修复它。

谢谢。

编辑

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

这是htop中两者的区别,

暂存(进程运行时间少于测试 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   

在这两个列表中,第二个/底部php 进程是由supervisord 启动的长期运行的进程。第一个/顶部是由第二个创建的,在终止之前运行 30 秒。本质上,Laravel 的队列系统会轮询队列(?!)。

有趣的是测试盒上所有的MEM数字都更高,但我觉得奇怪的是孩子的php进程的MEM数字也更高。由于它每 30 秒启动和停止一次,我原以为这两个盒子都是一样的。除非它实际上是主进程的一个分支?

【问题讨论】:

    标签: php linux laravel memory


    【解决方案1】:

    我建议安装 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

    测试 memmon 你能做的是这个

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

    【讨论】:

      【解决方案2】:

      根据Diego Velez 的回答,我设法弄清楚这是什么。

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

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

      原来slab分配的原因是由libcurl中的错误引起的dentry缓存。 This article 最终引导我找到了解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 2014-09-05
        • 2014-01-03
        • 1970-01-01
        • 2020-06-18
        • 2013-02-14
        相关资源
        最近更新 更多