答案1
正如我在评论中提到的,我没有理由相信 MySQL 是这里的瓶颈,但我确实认为 Web 服务器配置可能会导致这种情况。
例如apt-get install lamp-server^
,安装常规 LAMP 设置将安装 PHP 作为 Apache 模块并拉入预分叉MPM。默认情况下,它仅以有限数量的工作程序(分支)开始处理传入连接。任何新连接都不会被处理(但不会被拒绝)。所以,我认为您看到的只是工作程序“池”太小,无法处理所有连接。
当达到此限制时,类似这样的错误可能会出现在您的 Apache 错误日志中的某处:
[error] server reached MaxClients setting, consider raising the MaxClients setting
要在 Apache 中配置 prefork MPM,您可以在以下位置查看当前值/etc/apache2/apache2.conf
:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
为了改变这种情况,我建议在中创建一个新文件/etc/apache2/conf.d
,例如prefork-mpm-tuning.conf
,然后“重载”其默认设置(并重新启动 Apache):
<IfModule mpm_prefork_module>
StartServers 20 # |-- important to increase
MinSpareServers 20 # |
MaxSpareServers 50
MaxClients 70 # too high will get you out-of-memory here
MaxRequestsPerChild 0
</IfModule>
需要注意的是,Apache 只能扩大规模每秒仅从一个(硬编码,不可配置)并且永远不会缩小,除非您明确配置它。如Apache 有关性能调优的文档:
如果机器忙于生成子进程,它就无法处理请求。但是,这会对 Apache 的感知性能产生巨大影响,因此必须将其替换。从 Apache 1.3 开始,代码将放宽每秒一个的规则。它将生成一个,等待一秒钟,然后生成两个,等待一秒钟,然后生成四个,并且它将以指数方式继续,直到它每秒生成 32 个子进程。只要满足 MinSpareServers 设置,它就会停止。
这似乎足够灵敏,几乎不需要调整 MinSpareServers、MaxSpareServers 和 StartServers 旋钮。当每秒生成超过 4 个子进程时,将向 ErrorLog 发出一条消息。如果您看到很多此类错误,请考虑调整这些设置。使用 mod_status 输出作为指南。
虽然最后一段可能适用于一般情况,但在测试中我发现 Apache 在重新启动后似乎没有响应,这非常令人困惑。因此我的建议是以提高StartServers
设置。
总结一下:
- 您可能希望增加
StartServers
以接受从客户端发出的所有后续连接。Apache 的 prefork MPM 不是非常动态的工作器 - 为了能够使其在大量同时连接的情况下表现良好,您只需启动很多连接即可。 - 允许它分配足够的内存(实际上每个 fork 大约 20MB)。是的,在这个设计中,您需要大量的内存才能服务 100 个并发访问者。(如果您需要更少的内存和更高的性能,请查看 PHP-FPM)
- 限制
MaxClients
以防止 Apache 占用服务器的所有内存并使其崩溃。在此处进行计算和测试。 - 为了节省内存而设置
StartServers
得太低,同时保持较大的值MaxClients
是一件坏事:您的网站会因为每秒一次的原因而显得很慢,并且内存使用量以后无论如何都会增加。那时就会发生这种情况。
参考: