为什么我的内存使用逐渐增加?
Why is my memory used gradually increasing?
有点迷失在 top
和 free -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的回答,我弄明白了这是什么。
supervisord
和 php
没有做错任何事,不管引用的数字是否相反。原来我找不到内存去向的原因是因为它作为 slab 分配由内核拥有。
谢天谢地,虽然都是 SReclaimable
。具有讽刺意味的是,如果我今天不检查服务器并开始调试,我会看到内存使用量增加,然后在重新分配到 90% 左右时稳定下来。
事实证明,slab 分配的原因是 dentry
由 libcurl 中的错误引起的缓存。 This article 最终让我找到了解决方案。
有点迷失在 top
和 free -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的回答,我弄明白了这是什么。
supervisord
和 php
没有做错任何事,不管引用的数字是否相反。原来我找不到内存去向的原因是因为它作为 slab 分配由内核拥有。
谢天谢地,虽然都是 SReclaimable
。具有讽刺意味的是,如果我今天不检查服务器并开始调试,我会看到内存使用量增加,然后在重新分配到 90% 左右时稳定下来。
事实证明,slab 分配的原因是 dentry
由 libcurl 中的错误引起的缓存。 This article 最终让我找到了解决方案。