设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 2926|回复: 6

[Apache] Apache 中 KeepAlive 配置的合理使用 [复制链接]

LT管理团队

社区首席勤杂工

Rank: 9Rank: 9Rank: 9

签到
81
注册时间
2008-5-19
最后登录
2012-5-3
在线时间
1762 小时
阅读权限
200
积分
14979
帖子
2524
主题
1200
精华
25
UID
1

LT总司令

发表于 2008-9-22 14:23:25 |显示全部楼层
在 Apache 服务器中,KeepAlive 是一个布尔值,On 代表打开,Off 代表关闭,这个指令在其他众多的 HTTPD 服务器中都是存在的。

  KeepAlive 配置指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接,如果 KeepAlive 设置为 On,那么用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这一次 TCP 连接中完成,而不用重复建立新的 TCP 连接和关闭 TCP 连接,可以提高用户访问速度。

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

  对于上面3中情况,我认为:1 最适合打开 KeepAlive ,2 随意,3 最适合关闭 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 选项,我觉得可以基于下面的一个公式来判断。

  在理想的网络连接状况下,系统的 Apache 进程数和内存使用可以用如下公式表达:
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
  换成中文:
总Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求
Apache占用内存 = 总Apache进程数 * 平均每进程占用内存数

  需要特别说明的是:
  [平均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当 KeepAliveTimeout 等 0 或者 KeepAlive 关闭时,KeepAliveTimeout 不参与乘的运算从上面的公式看,如果 [每秒用户请求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存] 多,但是当 [平均KeepAlive请求] 的值越大时,[Apache进程数] 和 [内存] 都是趋向于减少的。

  基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout 时,关闭 KeepAlive 选项是划算的,否则就可以考虑打开。
感谢大家对linuxtone的支持!

Rank: 1

注册时间
2009-1-12
最后登录
2011-10-28
在线时间
2 小时
阅读权限
10
积分
1
帖子
2
主题
0
精华
0
UID
875
发表于 2009-1-12 15:16:40 |显示全部楼层
很不错的文章。支持一下。

使用道具 举报

Rank: 1

注册时间
2009-4-6
最后登录
2009-5-31
在线时间
7 小时
阅读权限
10
积分
4
帖子
8
主题
0
精华
0
UID
2347
发表于 2009-4-8 15:32:20 |显示全部楼层
能说说请求与访问的概念及他们之间的关系吗?

使用道具 举报

Rank: 1

注册时间
2009-4-6
最后登录
2009-5-31
在线时间
7 小时
阅读权限
10
积分
4
帖子
8
主题
0
精华
0
UID
2347
发表于 2009-4-8 15:52:29 |显示全部楼层
KeepAlive 配置指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接,如果 KeepAlive 设置为 On,那么用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这一次 TCP 连接中完成,而不用重复建立新的 TCP 连接和关闭 TCP 连接,可以提高用户访问速度。
请问:是请求返回完成后不会立即关闭TCP连接还是访问完成后不会立即关闭TCP连接?访问和请求是一个意思吗?
还有一点:HTTP/1.1在首次访问网站时建立持久链接,将多个请求批量或通过管道发送到输出缓冲区内。TCP协议允许将多个来自IP层的数据包请求或回复命令集中到一个TCP段中。因此减少了反复建立链接所需的时间,同时由于没有了不必要的申请链接数据包,也降低了网络流量。由于将命令通过管道输送,大大提高了 TCP段的效率。总之,网络流量降低了,性能提高了。这里的首次持久连接不论keepalive是on还是off都有有吗?

使用道具 举报

LT管理团队

社区首席勤杂工

Rank: 9Rank: 9Rank: 9

注册时间
2008-5-19
最后登录
2012-5-3
在线时间
1762 小时
阅读权限
200
积分
14979
帖子
2524
主题
1200
精华
25
UID
1

LT总司令

发表于 2009-4-8 16:32:58 |显示全部楼层
两个东西,一次访问可能有多个请求,
根据前面对KeepAlive的了解,它比较适合在一次页面访问中处理大量的HTTP请求。比如说你访问一个页面,这个页面包含很多JS,CSS链接还有很多当前站点的图片什么的,这样一个页面访问下来就已经像向服务器请求N次了,当然是在一个Browser/Server连接中处理掉比较快。再举一个不适用KeepAlive的例子,一次页面访问只有一两次HTTP请求的时候,而且还不带客户端缓存的,都是即时的动态内容,说着说着就有点接近AJAX 了,此时开启KeepAlive就不划算,和关闭KeepAlive相比服务器的CPU和内存消耗需求都会增加。
感谢大家对linuxtone的支持!

使用道具 举报

Rank: 1

注册时间
2009-4-16
最后登录
2010-6-12
在线时间
13 小时
阅读权限
10
积分
30
帖子
51
主题
0
精华
0
UID
2509
发表于 2009-4-16 13:34:00 |显示全部楼层
嗯,很不错,支持

使用道具 举报

Rank: 3Rank: 3

注册时间
2009-2-12
最后登录
2012-3-31
在线时间
44 小时
阅读权限
30
积分
268
帖子
27
主题
0
精华
0
UID
1400
发表于 2009-7-7 11:47:33 |显示全部楼层
好文章,不错,

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢红之盟网络提供带宽支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2012-5-23 11:28 , Processed in 0.215011 second(s), 12 queries , Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部