我们有一个web服务器,运行一个PHP应用程序来为客户服务。
随着客户负载的增加,我们出现了服务器内存问题。迟早,我们需要重新启动HTTP服务来释放内存(可能每天5次)。
我们可以从顶部中看出,大多数HTTP进程都很好,只使用少量内存,但是大约有3-4个HTTP进程占用了80%的内存和几乎零的CPU使用率。它看起来像是死进程,但在我们重新启动HTTP服务之前,它们不会释放内存。
我们怀疑PHP代码的某些部分工作不正常,导致大量内存使用,然后挂在那里。在我们可以设置的某个PHP设置中,是否会在空闲5分钟之后终止进程并释放内存?这是一个短期的解决方案,我们必须找出代码在做什么--尽管很难找到。
发布于 2011-04-13 07:41:04
php.ini文件中有几行是相关的。一个是memory_limit,它定义了一个给定的php脚本可以消耗多少内存,另一个是max_execution_time,它定义了在被关闭之前它得到多少CPU时间。请注意,后一次是基于CPU时间而不是时钟时间,所以如果它没有使用任何CPU,它可能永远不会加起来。
此外,正如您所注意到的,这些只是暂时的黑客攻击,以减轻一个行为不端的应用程序,而不是一个真正的修复程序。您可能会发现strace很有用,可以准确地确定占用内存的进程要做些什么。
发布于 2011-04-13 11:34:09
Apache有一个MaxRequestsPerChild指令,可以指示它在处理了一定数量的请求之后回收工作人员(嵌入mod_php的进程)。
发布于 2011-04-13 09:35:06
在Linux中,内存“缓存”是用于缓存文件的空闲内存。Linux使用尽可能多的内存来加速使用块设备的io。如果您的程序需要真正的内存,linux将在交换之前释放缓存页。
例如,现在在我的笔记本电脑上,我使用了90%的内存,但是使用了0%的交换。这是因为实际使用的内存只有20%。
托普会告诉你有多少内存将被缓冲。如果这个数字很大,这意味着使用的内存仅用于缓存,而不是实际使用的内存。白天,您可以检查需要交换多少内存(真正的问题)。
如果使用命令“free”,则有一行"-/+ buffers/cache“,并带有实际使用的内存。
您可以阅读/proc/sys/vm/swappiness来控制交换或缓存文件的内存数量。
https://serverfault.com/questions/259107
复制相似问题