Apache 已达到 MaxClients 数并挂起

Apache 已达到 MaxClients 数并挂起

当达到 MaxClients 数量时,我的 Apache 2.2(预制 MPM)会挂起,而不是将请求排队并在子进程空闲时为它们提供服务。发生这种情况时,Web 服务器完全没有响应,除非手动重新启动。

服务器堆栈是 Ubuntu 8、MySQL 5、PHP 5。硬件是双 Xeon(2.8),配备 2GB RAM。它每天提供 30,000 - 50,000 次页面浏览量。静态图像、CSS 和 JS 被卸载到单独的服务器,PHP 使用 eAccelerator 进行缓存。许多页面的 HTML 输出都缓存到文件系统中。

相关 Apache 指令:

KeepAlive On
MaxKeepAliveRequests 50
KeepAliveTimeout 2
StartServers          2
MaxClients          150
MinSpareThreads      25
MaxSpareThreads      75
ThreadsPerChild      25
MaxRequestsPerChild   2000

答案1

您的服务器似乎正在进行交换。假设 apache 进程使用 16 MB,则 150 x 16MB = 2400 MB,超出了您的服务器容量(2GB)

检查 Apache 使用的内存,我认为您需要减少 MaxClients 值。

您可以在硬件和操作系统问题部分来自 Apache 性能调优

答案2

您的超时变量设置为何值?

如果尚未设置,您可能需要将其向下推:

Timeout 30

正如 HD 所说,您可能希望降低 MaxClients 或增加 RAM 以确保它不会发生交换。

答案3

计算 MaxClients 并基于该值设置一个值,而不是默认值。

计算最大客户端

首先计算流量较高时 apache 子进程的平均内存。

将其除以您希望为 Apache 分配的内存。

在你的情况下,如果你希望为网络服务器提供 1 GB 的内存,并且平均进程内存使用量为 16 mb,那么1000MB/16=62

这是您应该给出的max_client值。

另外请确保你配置的是 prefork 而不是 worker

如果我没记错的话,这些是 prefork 的变量-

最小备用服务器

MaxSpareServers      

MaxClients          

MaxRequestsPerChild   

因为您在同一台机器上运行 mysql 和 apache。您需要添加更多 RAM,否则它将耗尽内存并开始交换。这会进一步减慢速度。

相关内容