我最近刚安装了 eaccelerator 并将 php 切换到 dso,服务器上一切正常,服务器负载大约为 1-2(4 个 CPU),一段时间后服务器超载(服务器负载增加到 250)并且服务器停止。在 suphp 模式下,服务器因流量过大而超载,因此我决定将其切换到 eaccelerator,现在我迷路了...有人能解释一下吗?
答案1
停止使用 suPHP。它会为每个 PHP 请求生成一个单独的进程,从而使 eAccelerator 变得毫无用处(因为缓存会随着每个请求被丢弃)。
答案2
从您的描述来看,这听起来像是带有 (dso-)php 的非线程 Apache。而且您有负载峰值,对吗?我以前也遇到过这种情况……
您的 apache 启动了多个服务器进程。如果传入连接数超出了您的进程的处理能力,则会生成更多服务器进程。
由于负载已经很高,因此生成需要一些时间。如果生成时间较长,并且在新生成的服务器进程运行之前有更多传入请求,则会生成更多进程,从而进一步减慢机器速度。在这种情况下,eaccelerator 不会起到太大作用。
那么你能做什么呢?嗯,你可以在 apache 配置中将 和StartServers
设置为比现在高得多的值。你应该确定系统上单个 apache 进程的平均大小(因为你使用 mod_php,它们一开始的大小应该大致相同,后来它们开始增长,因为 php 从不释放任何已分配的内存),并确定在你想要在 apache 上花费的内存量中可以容纳多少个这种大小的进程。你需要预先启动足够的服务器进程,以便在负载峰值期间保持活动状态,而不会产生太多进程。还要记住将 MaxRequestsPerChild 保持在合理的水平,以便不时释放 php 分配的内存。MinSpareServers
MaxSpareServers
长期解决方案是切换到 apache 上的线程 (worker-) MPM,这在 RAM 上更容易,因为 apache 线程共享内存(并且在系统上启动新线程比生成新进程容易得多)并将 fcgi 与 php 一起使用。eaccelerator 很好,我会将其保留在设置中。
答案3
好吧,即使启用了 eAccelerator,你对服务器的要求也太高了。当你达到 250 负载平均值时,有多少 apache 进程处于活动状态?听起来无论你的 php 配置如何,你都需要调整 apache 设置,这样它就不会启动比你的服务器硬件可以处理的更多的实例。