我的 Web 服务器正在为 PHP 应用程序运行 apache 1.3.x,同时在同一台机器上运行 mysql。大多数时候,它运行良好,CPU 使用率仍然有很好的余地,但不知何故,内存使用量在正常运行期间不断增长。
虽然它看起来好像不时被分块,但我的服务器确实因为内存不足而宕机过。重新启动 apache 或 mysql 只能减少 100M 的内存。
附件是每月内存使用情况的概览。两次大幅下降都是由于内存不足导致服务器重启。 http://imageshack.us/photo/my-images/51/memorymonth.png/
对他的行为有什么解释或者我该如何解决这个问题?
谢谢!Steven
答案1
Linux 内存管理基本上会尝试使用所有可能的内存。为了提高效率,“空闲”空间会不断用作缓冲区缓存。这会随着时间的推移而增长,但随着新进程需要更多内存,空闲池会逐渐减少,内存管理器会根据需要返回缓冲区缓存。因此,当您终止某些进程时,您可能会看到释放一小部分内存。但是,这种缓冲区缓存不会导致内存不足的情况。
问题:您使用的是 32 位还是 64 位 Linux 版本。如果您使用的是 32 位版本,那么 mysql 的某个 apache 进程可能碰到了 2GB 进程内存限制,因此报告内存不足。不过这只是猜测。
除了 apache 和 mysql 之外,您是否还运行了其他可能占用内存的应用程序。一些编码不当的 Java 应用程序也存在内存泄漏。目前还不清楚您的其他任何进程是否会导致内存问题。
对系统、进程混合、mysql 配置参数进行一些调查是可行的。
顺便说一句,我知道您可以使用以下命令(以 root 身份)刷新缓冲区缓存:
sync; echo 3 > /proc/sys/vm/drop_caches
然而,我并不建议您在生产环境中这样做,但在测试或基准测试环境中可能会很有趣。
希望这可以帮助。
答案2
图表显示的行为对于 linux/unix 来说是正常的,因为它会一直使用所有可用内存来更好地管理自身 - 如果您想了解更多,有无数文章讨论此行为。这就是为什么重新启动 mysql 或 apache 只能带来很小的“收益”。
由于您无法“解决”此特定行为,因此您需要检查导致内存不足问题的原因。Apache + php 很容易产生竞争条件,无论是由于流量激增还是您正在运行的应用程序中的错误。
调整 apache 配置中的限制、调整 mysql 的连接和内存限制、为 php 安装操作码缓存都是从现有设置中获取更高性能的方法。
请随时发布更多详细信息或其他问题以获得更多帮助。
祝你好运!