伙计们,我的服务器一整天都慢得难以置信,加载一个页面要花 2 分钟多的时间,但当我重新启动 Apache 时,它奇迹般地又变快了。有人知道为什么吗?我应该使用 cron 定期重新启动 Apache 吗?
答案1
这完全取决于您的 Apache 正在运行什么。它只是静态页面吗?还是您有动态代码?
通常,如果您发现一段时间后速度变慢,而重新启动进程后速度又恢复正常,则表明存在内存泄漏。Apache 本身不太可能存在重大内存泄漏(它被广泛使用且经过了充分测试),很可能是底层应用程序中的某个地方存在内存泄漏。
一定要监视系统上的进程,最好使用工具绘制其内存和 CPU 消耗随时间变化的图表,并找出罪魁祸首。
答案2
它会交换,重新启动 Apache 只会让所有工作进程脱离交换泥潭。这种情况会一直发生,除非您投入精力学习系统信息工具(如 sysstat),否则您将不断重新启动 Apache。sysstat 会跟踪所有进程和系统统计信息,以便您找出消耗所有内存的进程。一旦您知道了占用内存的进程(如 Kamil,我敢打赌是 Apache 内部的一个漏洞应用程序),您就可以执行特定于应用程序的诊断来确定确切原因并终止它。
答案3
由于我在 Apache 上运行(或曾经运行)的一些应用程序存在问题,因此我每天将其恢复一次(与 MySQL 一起)。
话虽如此,你真的不应该这样做 - 因为这是应用程序损坏的标志。我知道许多 Apache 服务器运行了数周甚至数月,只有在对服务器进行重大更新(即内核升级、新硬件等)时才会被弹回。
答案4
如果您了解 Linux 如何使用内存,这确实会有所帮助。Linux(默认情况下)喜欢将经常/最近访问的文件缓存在内存中,它会很乐意将 Apache、MySQL 和其他进程发送到脏页(交换),以便有空间维护这些文件缓冲区。
这可能是您想要的,也可能不是,具体取决于您的服务器。如果您正在运行典型的 LAMP,则有三个占用大量内存的进程都在争夺连续的物理内存:
- 阿帕奇
- MySQL
- PHP
很可能其他东西(可能是 ClamAV?)也需要内存。简而言之,需要物理内存的应用程序没有得到它。
您应该阅读一些 sysctl 调整,这些调整可以调整 Linux 从其页面缓存中回收内存以提供给应用程序的速度。“swappiness”和“vfs_cache_pressure”是两个很好的入门旋钮。如果不查看您的系统,我无法(具体)告诉您如何设置它们。
您还可以查看您的 Apache 配置,只需禁用保持活动请求即可防止如此多的空闲子进程不必要地驻留在内存中。同样,这很难说,我不确定您托管什么样的网站。另外,您是否使用默认的 MySQL 配置?您最好发布另一个问题,描述您的硬件、您托管什么样的网站以及您的慢速查询是什么样的,然后人们可以提出好的优化建议。
所以,简而言之(回答你的问题),不 - 仅让 cron 按照设定的时间间隔重新启动 apache 是一个非常糟糕的主意。最好修复潜在的问题。