保持所有因素不变,假设我的 apache 服务器配置如下,在事件 mpm 中
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 2
MaxSpareServers 5
MaxClients 200 #
ServerLimit 200 #
MaxRequestsPerChild 100
</IfModule>
由于 MaxClients 设置为200
,这将是任何时间点的最大活动连接数,
假设我的网站每秒接待 200 名访客,每个访客都会加载一个包含多张图片的页面,并且访问页面后会加载其他资源,
这是否意味着服务器请求的额外资源将由 apache 中的某个客户端处理,还是由客户端的子客户端处理?
我不明白为什么 apache 有这个,MaxRequestsPerChild
因为客户端受到ServerLimit
指令的限制,
MaxRequestsPerChild
在上述场景中如何应用?
答案1
每个子级的最大请求数指示工作进程何时需要关闭并更新,一般情况下你想要一个更大的数字或者 0在 MaxRequestsperChild 中,除非您知道某处存在内存泄漏,并且保持进程打开而不更新它们会导致问题。
由于 prefork 是进程模型,并且打开一个进程比在相同进程中打开线程对 CPU 的要求更高,因此将 MaxRequestsperChild 设置为 100 将使得 apache 在收到一些负载时不断更新进程。
还请记住,MaxClients 和 ServerLimit 在 prefork 中“是相同的”,但与线程模型的“事件”不同。
我建议您尽快切换到 mpm_event,但如果不能,出于我之前提到的原因,请根据您预期的最大客户端数量预先创建更多的备用服务器,如果您预期的最大并发数为 200,请将其稍微增加一点,并为负载峰值准备大约 50-100 台备用服务器。
正如我之前提到的,如果您有 200 个并发客户端,您永远不会希望 maxrequestsperchild 为 100 来更新该过程,除非您希望服务器以慢动作运行。