嘿,因为我是本引文的作者,所以我会回复:-)
大型站点上有两个大问题:并发连接和延迟。并发连接是由需要花很长时间才能下载内容的慢速客户端以及空闲连接状态引起的。那些空闲的连接状态是由连接重用来获取多个对象(称为“保持活动”)引起的,延迟会进一步增加该对象。当客户端离服务器非常近时,它可以充分利用连接并确保它几乎永远不会空闲。但是,当序列结束时,没有人会在意快速关闭通道,并且连接保持打开状态并长时间不使用。这就是为什么许多人建议使用非常低的保持活动超时的原因。在诸如Apache之类的某些服务器上,您可以设置的最低超时时间是一秒钟,而要承受高负载通常太高了:如果您前面有20000个客户端,并且它们平均每秒获取一个对象,则将永久建立这些20000个连接。像Apache这样的通用服务器上的20000个并发连接很大,根据要加载的模块的不同,将需要32到64 GB的RAM,即使添加RAM,也可能不希望更高。实际上,对于20000个客户端,您甚至可能在服务器上看到40000至60000个并发连接,因为如果浏览器要提取许多对象,它们将尝试建立2至3个连接。而且即使添加RAM,也可能不希望更高。实际上,对于20000个客户端,您甚至可能在服务器上看到40000至60000个并发连接,因为如果浏览器要提取许多对象,它们将尝试建立2至3个连接。而且即使添加RAM,也可能不希望更高。实际上,对于20000个客户端,您甚至可能在服务器上看到40000至60000个并发连接,因为如果浏览器要提取许多对象,它们将尝试建立2至3个连接。
如果在每个对象之后关闭连接,则并发连接数将大大减少。实际上,到对象之间的时间,下载对象的平均时间将下降一个因子。如果您需要50毫秒下载一个对象(一个微型照片,一个按钮等),并且如上所述平均每秒下载1个对象,则每个客户端只能有0.05个连接,这只有1000个20000个客户端的并发连接。
现在,建立新连接的时间到了。远程客户端将遇到不愉快的延迟。过去,禁用保持活动状态时,浏览器曾经使用大量并发连接。我记得在MSIE上为4,在Netscape上为8。这确实会使平均每个对象的延迟除以那么多。现在,到处都存在保持活动状态,我们不再看到大量数据了,因为这样做会进一步增加远程服务器上的负载,并且浏览器会保护互联网的基础结构。
这意味着,对于当今的浏览器,很难使非保持活动的服务与保持活动的服务一样快地响应。同样,某些浏览器(例如Opera)使用启发式方法尝试使用流水线。流水线是使用保持活动的有效方法,因为它通过发送多个请求而不等待响应来几乎消除了延迟。我已经在包含100张小照片的页面上进行了尝试,第一次访问的速度大约是不使用keep-alive的速度的两倍,但是下一次访问的速度大约是不使用keep-alive的速度的8倍,因为响应是如此之小,以至于只有延迟(仅“ 304”响应)。
我想说的是,理想情况下,浏览器中应该有一些可调参数,以使它们保持获取的对象之间的连接有效,并在页面完成后立即将其删除。但是不幸的是我们没有看到这一点。
因此,某些需要在前端安装通用服务器(例如Apache)且必须支持大量客户端的站点通常必须禁用保持活动状态。为了迫使浏览器增加连接数量,它们使用多个域名,以便可以并行下载。在大量使用SSL的站点上,这尤其成问题,因为连接设置更高,因为还要进行一次往返。
如今更常见的是,此类站点倾向于安装轻量级前端,例如haproxy或nginx,它们可以轻松处理成千上万的并发连接,它们在客户端启用了keep-alive,并在客户端禁用了keep-alive。 Apache方面。在这一方面,就CPU而言,建立连接的成本几乎为零,并且就时间而言根本不明显。这样一来,就可以提供两全其美的优势:由于保持活动状态而导致的延迟很短,客户端的超时时间非常短,而服务器端的连接数量却很少。每个人都很开心 :-)
一些商业产品通过重用前端负载均衡器和服务器之间的连接,并在它们之上多路复用所有客户端连接,进一步改善了这一点。当服务器靠近LB时,增益不会比以前的解决方案高很多,但是通常需要对应用程序进行调整,以确保不会由于多个用户之间意外共享连接而在用户之间造成会话交叉的风险。从理论上讲,这永远都不会发生。现实大不相同:-)