• Apache中KeepAlive 配置


    引子

      先来分析一个Yslow 测试的一个页面的前端性能。

      这里所有的请求是指http请求,对于一个请求各个阶段的划分,阻挡->域名解析->建立连接->发送请求->等待响应->接收数据。当然不是每个请求都要包含所有过程。

      在以上测试中,没有涉及到请求下载资源过程中还有一个部分:TCP请求的链接与断开,而这篇文章正式说这个请求的。 

      那么http请求和tcp请求是什么关系呢?简单点说就是一个tcp请求是比较靠近底层的,在它上面是http之类的应用请求,所以可以认为一个tcp请求包括很多个http请求(至于包括多少,apache中可以设定),同时tcp的链接与断开比http请求的链接和断开更需要消耗掉更多的内存资源和时间。 

     

     

    KeepAlive的含义                                                                               

     

      KeepAlive配置的含义:对于HTTP/1.1的客户端来说,将会尽量的保持客户的HTTP连接,通过一个连接传送多份HTTP请求响应。这样对于客户端来说,可以提高50%左右的响应时间,而于服务器端来说则降低了更多个连接的开销。不过这个依赖于客户端是否想保持连接。IE默认是保持连接的,当你打开100个图片的网站时,IE有可能只打开2个连接,通过这两个连接传送数据,而不是开100个连接。

      在 Apache 服务器中,KeepAlive 是一个布尔值,On 代表打开,Off 代表关闭,这个指令在其他众多的 HTTPD 服务器中都是存在的。

     

      KeepAliveTimeout 为持久连接保持的时间,也就是说,在这此连接结束后开始计时,多长时间内没有重新发送HTTP请求,就断掉连接。默认设置为5秒,这个值可以大点,但不能太大,否则会出现同时等候过多连接,导致多的内存被占用。

     

     

    KeepAlive的作用                                                                              

     

    如何谋求网络带宽与服务器资源之间的平衡。这个要根据具体情况,具体分析。

    那么我们考虑3种情况:
      1。用户浏览一个网页时,除了网页本身外,还引用了多个 javascript 文件,多个 css 文件,多个图片文件,并且这些文件都在同一个 HTTP 服务器上。
      2。用户浏览一个网页时,除了网页本身外,还引用一个 javascript 文件,一个图片文件。
      3。用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。

      对于上面3中情况,我认为:最适合打开 KeepAlive 随意,最适合关闭 KeepAlive

      
      在 Apache 中,打开和关闭 KeepAlive 功能,服务器端会有什么异同呢? 下面看理论分析。

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

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

      在看看实践的观察。

      在一组大量处理动态网页内容的服务器中,起初打开 KeepAlive功能,经常观察到用户访问量大时Apache进程数也非常多,系统频繁使用交换内存,系统不稳定,有时负载会出现较大波动。关闭了 KeepAlive功能后,看到明显的变化是: Apache 的进程数减少了,空闲内存增加了,用于文件系统Cache的内存也增加了,CPU的开销增加了,但是服务更稳定了,系统负载也比较稳定,很少有负载大范围波动的情况,负载有一定程度的降低;变化不明显的是:访问量较少的时候,系统平均负载没有明显变化。

      总结一下:
      在内存非常充足的服务器上,不管是否关闭 KeepAlive 功能,服务器性能不会有明显变化;
      如果服务器内存较少,或者服务器有非常大量的文件系统访问时,或者主要处理动态网页服务,关闭 KeepAlive 后可以节省很多内存,而节省出来的内存用于文件系统Cache,可以提高文件系统访问的性能,并且系统会更加稳定。 

     

     

    KeepAlive配置文件                                                                                   

     

      如果设置KeepAlive ,找到这个设置的文件颇为费时,以前版本的大多配置都在httpd.conf文件,现在版本(2.4.2)apache把不少配置都分离到不同的文件中了,于是,我只好一个文件一个文件的搜索。

    ...apache/conf/extra/httpd-default.conf

    #
    # This configuration file reflects default settings for Apache HTTP Server.
    #
    # You may change these, but chances are that you may not need to.
    ##
    # Timeout: The number of seconds before receives and sends time out.
    #
    Timeout 60
    #
    # KeepAlive: Whether or not to allow persistent connections (more than
    # one request per connection). Set to "Off" to deactivate.
    #
    KeepAlive On
    #
    # MaxKeepAliveRequests: The maximum number of requests to allow
    # during a persistent connection. Set to 0 to allow an unlimited amount.
    # We recommend you leave this number high, for maximum performance.
    #
    MaxKeepAliveRequests 100
    #
    # KeepAliveTimeout: Number of seconds to wait for the next request from the
    # same client on the same connection.
    #
    KeepAliveTimeout 5
    ## UseCanonicalName: Determines how Apache constructs self-referencing
     # URLs and the SERVER_NAME and SERVER_PORT variables.
    # When set "Off", Apache will use the Hostname and Port supplied
    # by the client.  When set "On", Apache will use the value of the
    # ServerName directive.
    #
    UseCanonicalName Off
    #
    # AccessFileName: The name of the file to look for in each directory
    # for additional configuration directives.  See also the AllowOverride 
    # directive.
    #
    AccessFileName .htaccess
    #
    # ServerTokens
    # This directive configures what you return as the Server HTTP response
    # Header. The default is 'Full' which sends information about the OS-Type
    # and compiled in modules.
    # Set to one of:  Full | OS | Minor | Minimal | Major | Prod
    # where Full conveys the most information, and Prod the least.
    #
    ServerTokens Full
    #
    # Optionally add a line containing the server version and virtual host
    # name to server-generated pages (internal error documents, FTP directory 
    # listings, mod_status and mod_info output etc., but not CGI generated 
    # documents or custom error documents).
    # Set to "EMail" to also include a mailto: link to the ServerAdmin.
    # Set to one of:  On | Off | EMail
    #
    ServerSignature Off
    #
    # HostnameLookups: Log the names of clients or just their IP addresses
    # e.g., www.apache.org (on) or 204.62.129.132 (off).
    # The default is off because it'd be overall better for the net if people
    # had to knowingly turn this feature on, since enabling it means that
    # each client request will result in AT LEAST one lookup request to the
    # nameserver.
    #
    HostnameLookups Off
    #
    # Set a timeout for how long the client may take to send the request header
    # and body.
    # The default for the headers is header=20-40,MinRate=500, which means wait
    # for the first byte of headers for 20 seconds. If some data arrives,
    # increase the timeout corresponding to a data rate of 500 bytes/s, but not
    # above 40 seconds.
    # The default for the request body is body=20,MinRate=500, which is the same
    # but has no upper limit for the timeout.
    # To disable, set to header=0 body=0
    #
    <IfModule reqtimeout_module>
      RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
    </IfModule>

     

    文件的注释部分已经给出了每个参数的具体含义,所以这里就没必要一一解释了。

     

    本篇内容,会同步更新到新的博客:http://tt-topia.rhcloud.com/ 
    转载请注明:虫师

     

  • 相关阅读:
    利用Python对文件进行批量重命名
    应用程序处于中断模式-设置方法
    idea http请求的插件(测试接口方便)
    ajax 分页(jquery分页插件pagination) 小例3
    JProfile 9.2 linux安装及windows客户端远程监控
    serializeObject 的应用
    linux下 mysql数据库的备份和还原
    ajax 分页(jquery分页插件pagination) 小例2
    bootstrapTable 应用小例(收索)
    表格 td中,取checkbox后几位值
  • 原文地址:https://www.cnblogs.com/fnng/p/2787755.html
Copyright © 2020-2023  润新知