概述:
随着客户端一侧的并发连接数不断增加,服务器会逐渐耗尽网络资源,而这并不一定是因为服务器的硬件配置不够奢华,也并不一定意味着服务器应该增加带宽。性能上的瓶颈是在于服务器耗费了更多的资源来处理客户端一侧的大量短连接。为此,我们通过连接复用技术加快了后台服务器的TCP连接处理速度,从而消除了服务器面对多客户端连接时的性能瓶颈,相对以往的处理方式达到了事半功倍的效果。
第一部分 什么是复用连接技术
作为一名专业的网络服务器管理人员,您可能会遇到这样的情况:应对越来越大的用户访问量,您的服务器逐渐不堪重负。于是您开始致力于服务器的升级与优化。然而,在您为此投入了大量物力与精力的同时,收效却明显与付出不相称。于是,您开始对自己的服务器机组本身产生了质疑。
“我真的需要再投入更多的资金来增加更多的服务器吗?”
几年前,我们的技术工程师也提出了同样的疑问。
经过我们反复分析与研讨,我们意识到有很多和我们一样的网络工程师都临着类似的情形。一旦我们能找到并突破这个性能上的瓶颈,将可以大大地提升服务器应对高数据流量时的处理性能,并为我们的客户节约大量的经费。
经过努力,我们终于成功研发出了这项技术,使我们仅有的几台服务器组成的服务器机组具备了卓越的多用户连接处理能力,而这就是我们要着重介绍的技术——连接复用技术。
我们首先来了解一下传统的网络拓扑结构:
在这样的结构中,应用前端设备在WEB客户端和WEB服务器之间。应用前端设备仅仅是完成了接受连接、检测连接并传递连接的作用。在这样的工作模式下,随着客户端的不断增加,每增加一个用户,就建立一条客户端-服务器的1对1连接。在低数据流量时,这样的结构是毫无问题的。
然而,当服务器的连接数增加到一定数量的时候,服务器性能就会显著降低,直至耗尽网络资源。而这并不一定是因为服务器的硬件配置不够奢华,也并不一定意味着服务器应该增加带宽。由于在设计服务器的时候通常不会考虑到对大量数据流的并发连接,因此性能上的瓶颈恰恰是在于服务器耗费了更多的资源来处理客户端一侧的大量短连接。
随着服务器连接数的进一步增加,糟糕的事实是:TCP/IP协议栈只能处理高吞吐量的数据而不能处理大量的短连接,最终导致服务器耗尽网络资源。测试表明:服务器消耗80%的资源在处理TCP连接建立和拆除的工作。
我们的连接复用技术的原理是将数量巨大的短连接转化成相对少数的几个高吞吐量的长连接。这样可使我们在不改变服务器任何配置和内容的前提下充分发挥服务器对高吞吐量数据的处理能力,从而使巨大短链接数造成的性能瓶颈迎刃而解。
第二部分 连接复用技术内幕
HTTP/1.1有一个特点:允许在同一个TCP连接上有多个HTTP请求。我们的连接复用技术正是利用了这个特点,取代了传统中通过每一个HTTP连接的从客户端到服务器的1对1模式。应用了连接复用技术,如果有客户端的请求则查找是否有可复用连接,如没有则建立,并保持住,以供之后复用;如果有,则从已建立的该服务器的连接池中选择一个连接,并在此连接上发送客户端的请求。在每个连接中最多可以同时处理90个请求。
采用了连接复用技术的网络拓扑结构如下:
为了能够执行连接复用,我们在应用前端设备中做了完整的代理工作。有了这个功能,设备提前对源服务器打开一些连接,并保持他们打开的状态。对于从不同客户端来的连接,设备会尝试重复使用这些提前打开的连接,这样的状态将一直保持至从服务器收到了一个“Connection:Close”的HTTP头或者TCP FIN数据包。
因为连接复用,我们的前端设备可以利用在大量TCP协议栈中都存在的Van Jacobson报头预测。(包括微软Windows 2000/Net, Solaris, Linux, 和很多种类的BSD Unix)。利用TCP协议栈的这个特点,可以为从核心操作系统(内核空间)到WEB服务器应用程序(用户空间)移动数据包提供一个快速通道。每个数据包需满足以下要求:
数据包的相关连接已建立。
SYN, FIN, RST,URG标志不得设置。
数据包必须承认以前发送的数据。
数据包是有序的。
TCP的窗口大小没有改变。
W.理查德.史蒂文(TCP/IP系列的作者,TCP/IP协议的定义者)在测试性能时发现,报头预测的全过程中有97%至100%的时间是在局域网环境里进行的,相对应的就是在我们的前端设备和服务器之间进行报头预测。
连接复用另一个重要的好处是:它可以消除服务器上因频繁启用新连接而造成的负荷——对于一个进程来说,其代码路径往往不如一个满足信息头预测要求的数据包更加优化。再者,在没有启动新的连接的情况下,服务器不太可能把他们的临时端口改成TIME_WAIT状态。
因为连接复用取消了客户端和服务器之间的1对1的关系,前端设备在每一个请求中插入了X-Forwarded-For HTTP报头,这个报头里含有客户端的IP地址。前端设备中的IIS和Apache网络服务器模块可以在必要的数据结构、登陆系统、CGI环境变量中设置客户端的IP地址。我们同时将这些模块的源代码提供给我们的客户。
如果管理员选择不启用连接复用功能,那么我们的前端设备可以通过获取每个数据包IP报头上的客户IP地址成为一个透明代理,因此对源服务器来说,其工作方式就等同于直接与客户浏览器通信。
注意,在负载均衡产品中,连接复用和客户端IP透明模式是互相排斥的。这是因为在启动连接复用功能后,如果从客户端取得IP地址采用IP欺骗的方式与服务器通信,同时又要保持着连接打开,这样就无法再使用第二个请求中的另一个客户端IP地址与服务器通信。为此,最好的方式就是在每一个请求上插入含有客户端真实IP地址的X-Forwarded-For HTTP报头。
(责任编辑:)