【发布时间】:2015-04-07 16:20:03
【问题描述】:
迷失在top 和free -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 秒启动和停止一次,我原以为这两个盒子都是一样的。除非它实际上是主进程的一个分支?
【问题讨论】: