我们有一个运行 PHP 应用程序的网络服务器来为客户提供服务。
- PHP 4
- 3 GB 内存
- Centos
- Apache HTTP 服务器。
随着客户负载的增加,我们遇到了服务器内存问题。我们迟早需要重新启动 HTTP 服务来释放内存(可能每天 5 次)。
我们可以看出顶部大多数 HTTP 进程都很好,只占用少量内存,但大约有 3-4 个 HTTP 进程占用了 80% 的内存,而 CPU 使用率几乎为零。看起来像是死进程,但直到我们重新启动 HTTP 服务时它们才会释放内存。
我们怀疑我们的 PHP 代码的某些部分运行不正常,导致内存占用过大,然后就挂了。我们是否可以设置某个 PHP 设置,以便在闲置 5 分钟后终止进程并释放内存?这是一个短期解决方案,我们必须找出是什么代码在做这件事——虽然很难找到。
答案1
文件中有几行php.ini
是相关的。一个是memory_limit,它定义了任何给定的php脚本允许消耗多少RAM,另一个是max_execution_time,它定义了在被杀死之前可以获得多少CPU时间。请注意,后者的时间基于CPU时间而不是时钟时间,因此如果它不使用任何CPU,它可能永远不会累加。
此外,正如您所指出的,这些只是缓解应用程序运行不正常情况的临时方法,而不是真正的解决方案。您可能会发现,strace
弄清楚占用大量内存的进程究竟在做什么很有用。
答案2
Apache 有一个每个子进程的最大请求数该指令可以在处理一定数量的请求之后指示回收工作者(嵌入 mod_php 的进程)。
答案3
在 Linux 中,“缓存”内存是用于缓存文件的空闲内存。Linux 使用尽可能多的内存来加速块设备的 io。如果您的程序需要实际内存,Linux 将在交换之前释放缓存页面。
例如,现在我的笔记本电脑上,内存使用率为 90%,但交换空间为 0%。这是因为实际使用的内存只有 20%。
Top 会告诉您有多少内存用于缓冲。如果这个数字很大,则意味着使用的内存仅用于缓存,而不是实际使用的内存。在白天,您可以检查有多少内存用于交换(您的真正问题)。
如果您使用命令 'free',则会看到一行“-/+ buffers/cache”,其中包含您实际使用的内存。
您可以阅读有关 /proc/sys/vm/swappiness 的信息来控制用于交换或缓存文件的内存量。