今天我们在服务器上遇到了一个问题,文件/脚本加载时间超过 3 秒。解决方案很简单 - 只需将 MaxClients 增加到估计的内存限制即可。但我担心该解决方案的可扩展性,而且它似乎不太可靠 - 如果负载稍微增加,问题就会再次出现。
我们正在开发的 Web 服务的性质(小型在线游戏)要求我们嵌入 AJAX 机制,该机制每 15 秒发送一个信标,表明客户端在线。
让我们想象一下以下设置。Apache 2 (mpm_prefork),MaxClients = 150,KeepAlive = on,KeepAliveTimeout = 5。有 300 个用户在线。我的理解是否正确 - 如果所有 300 个用户同时发送信标(只需使用 POST 检索 beacon.php 脚本) - 前 150 个客户端几乎会立即得到答复,而其他 150 个客户端必须等待 5 秒钟才能得到答复?
第二个问题。对我而言,最好的解决方案是什么?完全禁用 keep alive 吗?
答案1
apache 2 中的 MaxClients 是所有 apache 进程同时处理的最大请求数。使用 prefork mpm,这也是同时运行的 apache 进程的最大数量,以及打开到 Web 服务器的传入网络连接的最大数量。
KeepAlive 的整个目的是减少访问网站时为每个 HTTP 请求启动新 TCP 连接的开销,因为每个新页面都可能需要数十个文档(初始 html、css、javascript、图像等)。最终结果是页面加载速度更快。
MaxKeepAliveTimeout 指示 Web 服务器在关闭连接之前将等待来自空闲客户端的额外 hHT 请求的时间,从而使其能够为新传入的连接提供服务。
在您的情况下,如果您有 150 个客户端在启用 KeepAlive 的情况下同时发送信标,那么其他用户需要再等 5 秒钟才能发送信标。假设要求每 15 秒发送一次信标,则最大并发用户数为 450 个。
解决方案:
您可以将 MaxKeepAliveTimeout 减少到 2 秒,增加时收益会减少。最大的好处是初始页面加载,并且这些请求之间几乎没有延迟。
您可以完全禁用 KeepAlive,增加所有页面的加载时间,假设大多数用户在游戏中花费大部分时间。
必须在客户端和服务器端都启用 keepalive 才能使用。假设您控制客户端 javascript,则可以使用以下命令在客户端针对特定请求禁用 keepalive:
connection.setRequestProperty("Connection", "close");
类似地,您可以通过操作 Connection 响应标头来禁用服务器端特定 http 请求的 Keepalive。
希望这可以帮助!
答案2
这篇文章很好地描述了 Apache2 保持活动机制的整个工作原理调整 Apache
你需要在以下两者之间找到平衡:最大客户数和KeepAlive 超时值以使用此功能。根据服务器中的可用内存增加第一个值或减少第二个值。