Apache 中 KeepAlive 配置的合理使用(优化)-阿里云开发者社区

开发者社区> 科技小先锋> 正文

Apache 中 KeepAlive 配置的合理使用(优化)

简介:
+关注继续查看
apache 中 keepalive 配置的合理使用(优化)

在 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 选项是划算的,否则就可以考虑打开。


本文转自守住每一天51CTO博客,原文链接:http://blog.51cto.com/liuyu/84768,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
CentOS6.4 LVS+keepalived高可用负载均衡服务配置
<p style="color:rgb(85,85,85)"><span style="font-size:24px; color:#4f81bd"><strong>CentOS6.4 LVS+keepalived高可用负载均衡服务配置</strong></span></p> <p style="color:rgb(85,85,85)"> </p> <p style="color:rg
1334 0
Keepalived 常用配置+检测脚本
1、在与其他服务一起运行下做高可用时,比如NGINX,需要在NGINX断开的时候先尝试启动一次NGINX,如果启动不行,漂移keepalived到备机,所以需要在配置下加检测脚本。
838 0
iOS大型项目解耦方案有难度?BeeHive设计优化来帮助
在2017年在线技术峰会——阿里开源项目最佳实践上,来自天猫的戴鹏带来了BeeHive关于iOS大型项目解耦方案的分享。他从多人开发的问题介绍了业界的三种模块方案,将传统Init与BeeHive Module进行了比较,对BeeHive的架构进行了分析,并对Module Manager和Module的实现进行了详细介绍。
9677 0
Keepalived 日志配置与启动配置
在Redhat系统下,可以使用下面的方法将keepalived的日志输出到/var/log/下的某个文件里:  1.将keepalived日志输出到local0:  vim /etc/sysconfig/keepalived  KEEPALIVED_OPTIONS="-D -d -S 0"  2.
1670 0
用Bind配置AD(Active Directory)
PS: 先转了! 系统环境:1、Centos 5.6  2、Bind 9.3 事项:使用bind 作为DNS Server 配置域控器(AD) ##############################################     在配置AD中较多人都使用本身AD来配置成DNS 服务器,这也方便快捷。Bind我使用了较长时间,觉非常不错,个人比较偏爱使用。
1142 0
4571
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载