1.keep-alive

   linux内核配置有一项tcp_keepalive_time,即tcp的保活定时器。当网络上两个建立连接的进程都没有数据向对方发送的时候,tcp会隔段时间发送一次保活数据,以保持连接,间隔时间就是tcp_keepalive_time设置的。默认是7200秒。在优化web服务器时,应该将数值设置的小一点,当客户关机,崩溃的时候可以更快的发现,而没必要等待2个小时才察觉,这样可以更快的清理无效的连接。

   http的keepalive : 默认http服务器在完成一个http响应以后会关闭这个连接,设置此项以后会保活一段时间,继续用此连接继续接受客户的请求。这样有效的减少了系统建立tcp连接的开销,但是保持连接也会占用系统资源,使用的时候要权衡一下,一般小文件多的站应该用,大文件的下载没必要。

2.keep-alive出现的原因:

当一个客户端向服务器发送http请求时,两者之间会建立一个tcp连接,然后服务器发回响应信息同时关闭连接。如果请求的的页面中含有别的资源连接,比如图片、flsah等,就会再次创建连接。keep-alive的作用就是在第一次创建连接时,服务器会把这个tcp连接保持一段时间(服务器端会有一个keepaliveTime的最大时间,超过时间就断开连接)。这样就不会频繁的去建立tcp连接,同一次请求中的信息传递都可以使用同一个tcp连接。

   在HTTP1.0和HTTP1.1协议中都有对KeepAlive的支持。其中HTTP1.0需要在request中增加“Connection: keep-alive” header才能够支持,而HTTP1.1默认支持。


  1>HTTP1.0 KeepAlive支持的数据交互流程如下:

    a)Client发出request,其中该request的HTTP版本号为1.0。同是在request中包含一个header:“Connection: keep-alive”。

       b)Web Server收到request中的HTTP协议为1.0及“Connection: keep-alive”就认为是一个长连接请求,其将在responseheader中也增加“Connection: keep-alive”。同是不会关闭已建立的tcp连接。

       c)Client收到Web Serverresponse中包含“Connection: keep-alive”,就认为是一个长连接,不close tcp连接。并用该tcp连接再发送request。(跳转到a)

   2>HTTP1.1 KeepAlive支持的数据交互流程如下:

      a)Client发出request,其中该requestHTTP版本号为1.1

      b)Web Server收到request中的HTTP协议为1.1就认为是一个长连接请求,其将在responseheader中也增加“Connection: keep-alive”。同是不会关闭已建立的tcp连接。

      c)Client收到Web Serverresponse中包含“Connection: keep-alive”,就认为是一个长连接,不close tcp连接。并用该tcp连接再发送request。(跳转到a)

 3.关于keep-alive的分析:

    现在的一些服务器都可以设置keep-alive是否开启,以及keep-alive的超时时间,服务器支持的keep-alive数量(数量一般不会很大,否则会对服务器产生很大的压力)。

那么我们考虑3种情况:

  1、用户浏览一个网页时,除了网页本身外,还引用了多个javascript 文件,多个css 文件,多个图片文件,并且这些文件都在同一个HTTP 服务器上。

  2、用户浏览一个网页时,除了网页本身外,还引用一个 javascript 文件,一个图片文件。

  3、用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。

  对于上面3种情况,最适合打开keep-alive 随意,最适合关闭keep-alive

打开keep-alive 后,意味着每次用户完成全部访问后,都要保持一定时间后才关闭会关TCP 连接,那么在关闭连接之前,必然会有一个服务器进程对应于该用户而不能处理其他用户,假设keep-alive 的超时时间为10 秒种,服务器每秒处理50 个独立用户访问,那么系统Apache 的总进程数就是 10 * 50 = 500 个,如果一个进程占用 4M 内存,那么总共会消耗 2G 内存,所以可以看出,在这种配置中,相当消耗内存,但好处是系统只处理了50TCP 的握手和关闭操作。

     如果关闭 keep-alive,如果还是每秒50个用户访问,如果用户每次连续的请求数为3个,那么Apache 的总进程数就是 50 * 3 = 150 个,如果还是每个进程占用 4M 内存,那么总的内存消耗为 600M,这种配置能节省大量内存,但是,系统处理了150 TCP 的握手和关闭的操作,因此又会多消耗一些CPU 资源。