当达到 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,否则它将耗尽内存并开始交换。这会进一步减慢速度。