我们有一个运行PHP应用程序的Web服务器来为客户服务。
随着客户负载的增加,我们遇到了服务器内存问题。 迟早,我们需要重新启动HTTP服务来释放内存(大概每天5次)。
我们从上面可以看出,大部分的HTTP进程都是正常的,只使用一点内存,但是大约有3-4个HTTP进程占用了80%的内存和几乎为零的CPU使用率。 它看起来像死进程,但它们不释放内存,直到我们重新启动HTTP服务。
我们怀疑我们的PHP代码的一部分工作不正常,造成巨大的内存使用,然后挂在那里。 有没有一个PHP设置的地方,我们可以设置,将终止进程,释放内存空闲5分钟后,说: 这是一个短期的解决scheme,但是我们必须找出哪些代码正在做这个 – 很难find。
在你的php.ini
文件中有几行是相关的。 一个是memory_limit,它定义了给定的php脚本允许通过多less内存,另一个是max_execution_time,它定义了在被closures之前CPU时间有多less。 请注意,后面的时间是基于CPU时间而不是时钟时间,所以如果不使用任何CPU,它可能永远不会加起来。
也正如你所指出的,这些是暂时的黑客来缓解一个错误的应用程序,而不是一个真正的修复。 你可能会发现strace
很有用,可以确切地知道内存占用过程是怎样的。
Apache有一个MaxRequestsPerChild指令,可以指示在处理了一定数量的请求之后回收工作人员(embeddedmod_php的进程)。
在Linux中,内存“caching”是用来caching文件的空闲内存。 Linux使用尽可能多的内存来加速块设备的io。 如果你的程序需要真正的内存,linux会在交换之前释放caching页面。
例如,现在在我的笔记本电脑上,我使用了90%的内存,但交换了0%。 这是因为实际使用的内存只有20%。
顶部会告诉你有多less内存要缓冲区。 如果这个数字很大,这意味着使用的内存仅用于caching,而不是实际使用的内存。 白天,你可以检查有多less内存将交换(你真正的问题)。
如果你使用“free”这个命令,你可以用“ – / + buffers / cache”和你的实际使用的内存一致。
您可以阅读关于/ proc / sys / vm / swappiness来控制交换或caching文件的内存。