今天我们在服务器上遇到了一个问题,当文件/脚本需要更多的3秒加载。 解决scheme很简单 – 只需将MaxClients增加到估计的内存限制即可。 但是我担心该解决scheme的可伸缩性,而且看起来不太可靠 – 如果负载稍微增加,问题就会再次出现。
我们正在开发的web服务的性质 – 小型在线游戏 – 要求我们embeddedAJAX机制,每隔15秒发送一个信标,指示客户端在线。
让我们想象下面的设置。 Apache 2(mpm_prefork),MaxClients = 150,KeepAlive = on,KeepAliveTimeout = 5。有300个用户在线。 我是否理解正确 – 如果所有300个用户同时发送一个信标(只需使用POST检索beacon.php脚本) – 首先150个客户端将立即得到答案,而另外150个用户将需要等待5秒钟才能得到回答?
第二个问题。 在我的情况是什么是最好的解决scheme? 禁用保持活着?
apache 2中的MaxClients是所有apache进程中将同时发送的最大请求数。 使用prefork mpm,这也是apache进程的最大数量,它将以一致的方式运行,并允许最大数量的打开的传入networking连接到您的Web服务器。
KeepAlive的重点在于减less访问站点时为每个HTTP请求启动新的TCP连接的开销,因为每个新页面可能需要数十个文档(初始html,css,javascript,图像等)。 最终的结果是加载速度更快的页面。
MaxKeepAliveTimeout指示在closures连接之前,web服务器等待来自空闲客户端的额外hHT请求的时间,使其能够服务新的不兼容的连接。
在你的情况下,如果你有150个客户端在启用KeepAlive的情况下立即发送信标,那么是的,在其他用户可以进入信标之前需要5秒钟的时间。假设要求每隔15秒发送一个信标,最多450个用户。
解决scheme:
你可以把MaxKeepAliveTimeout减less到2秒,增加的时候会有收益递减的效果。 最大的好处是初始页面加载,并且这些请求之间几乎没有延迟。
假设大多数用户花费大部分时间在游戏中,您可以完全禁用KeepAlive,从而增加所有页面的加载时间。
Keepalive必须启用客户端以及服务器端才能使用。 假设你控制你的客户端JavaScript,可以禁用客户端上的Keepalive为特定的请求,使用:
connection.setRequestProperty("Connection", "close");
同样,您可以通过操作连接响应头来禁用服务器端的特定http请求的Keepalive。
希望这可以帮助!
Apache2保持活动机制如何工作的整个概念在本文中很好地描述了调整Apache
您需要在MaxClients和KeepAliveTimeout值之间find一些平衡来使用此function。 根据服务器的可用内存增加第一个或减less第二个。