How to debug full RAM memory?

时间:2018-08-17 作者:Peter Westerlund

我们的网站一次又一次地宕机。问题总是一样的。内存不足。主机的答案总是一样的:购买更多的RAM。

最终也可能需要这样做。但我首先想通过代码来追踪到底是什么导致了完整的内存。我们的网站没有多少访问者。因此,我真的怀疑有多少访问者会导致大量连接和RAM内存问题。感觉更像是有一些使用了大量记忆的脚本。我们每隔一分钟就有几个cron作业在运行。所以看看他们使用了多少内存会很有趣。

因此,我想看到的是,所有不同的脚本/连接/页面加载使用了多少内存,以及当网站关闭时,同时有多少访问者/页面加载。

那么,如何跟踪php内存使用情况呢?

1 个回复
SO网友:Mark Kaplun

Just buy more RAM

在真正的OSs中,没有“释放”内存这样的事情。一旦为应用程序分配了内存,它就归它所有,不太可能“返回”到操作系统。因此,如果您有一个“泄漏”内存的应用程序,它将在某个时候消耗所有可用的RAM。

web服务器通常处理需要执行PHP代码的请求的方式是派生一个进程来处理它。由于生成进程本身不是一件非常有效的事情,因此它们会在web服务器启动时生成多个进程,并与之通信。这样一个进程可以使用多少内存?如上所述,分配的内存永远不会返回给操作系统,因此最大内存量将是允许PHP使用的最大内存量。

web服务器的开发人员并不完全是白痴,他们知道内存分配的限制,为了解决这个问题,每个PHP处理进程都会在某个时候被杀死,通常是基于用户配置的标准。这减少了所有这些进程一起获得最大内存的机会。

因此,您实际上不需要任何特殊调试来了解如何使用所有RAM。这是一个简单的公式(PHP处理进程的数量)*(PHP可以分配的最大内存)。如果结果远远高于物理RAM,那么您就有麻烦了。

如何修复?您可以将web服务器配置为具有较少的PHP处理程序。这将降低web服务器在负载下的响应能力,因为进程必须在开始处理新请求之前完成它所做的任何事情。或者您可以降低PHP的最大内存设置,但由于您已经消耗了所有RAM,这可能还不够,因为这不是核心问题(而是进程的数量),否则某些地方会出现问题。

在继续之前,我是否已经说过just buy more RAM

达到最大RAM表示服务器设置不好或软件设计不好。

第一个问题很容易解决,最坏的情况下,这意味着你处理的流量比你预期的要多,如果你真的赚到了钱,这是一件好事。

第二个问题是你不太可能解决的。您不能花费数年的开发时间来忽视将PHP内存限制在最低限度的最佳实践,并通过提高限制来修复内存问题,而希望在一个月内重构代码而不破坏任何东西(特别是因为该站点不太可能有任何自动或甚至手动测试计划来验证没有任何东西被破坏)。

忽视软件开发最佳实践以达到“演示”阶段是很酷的,在这个阶段,您可以评估在项目上投入更多精力是否值得,继续使用那些页面生成器和ACF以及任何其他RAD垃圾作为最终产品的基础是不酷的,或者,至少如果你喜欢这样做,你需要明白,迟早你会不得不这样做的buy more RAM. 老实说,虽然我个人不喜欢页面生成器、ACF等,但如果你的网站不会增长太多,那么在需要时购买更多RAM可能是更具成本效益的解决方案。

结束

相关推荐

Keeping Objects in Memory

我用类构建了一个WordPress插件。每个项目类都是为特定用户创建的。我想做三件事:在用户的请求之间为该用户保留项目对象的内存一旦用户注销或在某个过期时间后将其删除</如果用户(通过表单)编辑该对象的项目信息,请删除并重新创建</有人知道怎么做吗?