转载链接:http://hi.baidu.com/jx_iben/item/d5fe91feed74495ec9f337f1

在网页开发过程中,Keep-Alive是HTTP协议中非常重要的一个属性。大家知道HTTP构建在TCP之上。在HTTP早期实现中,每个HTTP请求都要打开一个socket连接。这种做效率很低,因为一个Web 页面中的很多HTTP请求都指向同一个服务器。例如,很多为Web页面中的图片发起的请求都指向一个通用的图片服务器。持久连接的引入解决了多对已请求服务器导致的socket连接低效性的问题。它使浏览器可以再一个单独的连接上进行多个请求。浏览器和服务器使用Connection头ilai指出对Keep-Alive的支持。

笔者在去年遇到一个跟Keep-Alive的问题:

问题现象: 一个JSP页面,居然要耗时40多秒。网页中有大量的图片的CSS

问题解决: 原因也找了半天,原来Apache配置里面,把Keep-Alive的开关关闭了。这个是个大问题,工程师为什么要关闭它,原来他考虑的太简单了,我们知道Apache适合处于短连接的请求,处理时间越短,并发数才能上去,原来他是这么考虑,但是没有办法,只能这样了,还是打开Keep-Alive开关吧。

当然,不是所有的情况都设置KeepAlive为On,下面的文字总结比较好:

【在使用apache的过程中,KeepAlive属性我一直保持为默认值On,其实,该属性设置为On还是Off还是要具体问题具体分析的,在生产环境中的影响还是蛮大的。

KeepAlive选项到底有什么用处?如果你用过Mysql ,应该知道Mysql的连接属性中有一个与KeepAlive 类似的Persistent Connection,即:长连接(PConnect)。该属性打开的话,可以使一次TCP连接为同一用户的多次请求服务,提高了响应速度。

比如很多网页中图片、CSS、JS、Html都在一台Server上,当用户访问其中的Html网页时,网页中的图片、Css、Js都构成了访问请求,打开KeepAlive 属性可以有效地降低TCP握手的次数(当然浏览器对同一域下同时请求的图片数有限制,一般是2),减少httpd进程数,从而降低内存的使用(假定prefork模式)。MaxKeepAliveRequests 和KeepAliveTimeOut 两个属性在KeepAlive =On时起作用,可以控制持久连接的生存时间和最大服务请求数。

不过,上面说的只是一种情形,那就是静态网页居多的情况下,并且网页中的其他请求与网页在同一台Server上。当你的应用动态程序(比如:php )居多,用户访问时由动态程序即时生成html内容,html内容中图片素材和Css、Js等比较少或者散列在其他Server上时,KeepAlive =On反而会降低Apache 的性能。为什么呢?

前面提到过,KeepAlive =On时,每次用户访问,打开一个TCP连接,Apache 都会保持该连接一段时间,以便该连接能连续为同一client服务,在KeepAliveTimeOut还没到期并且MaxKeepAliveRequests还没到阈值之前,Apache 必然要有一个httpd进程来维持该连接,httpd进程不是廉价的,他要消耗内存和CPU时间片的。假如当前Apache 每秒响应100个用户访问,KeepAliveTimeOut=5,此时httpd进程数就是100*5=500个(prefork 模式),一个httpd进程消耗5M内存的话,就是500*5M=2500M=2.5G,夸张吧?当然,Apache 与Client只进行了100次TCP连接。如果你的内存够大,系统负载不会太高,如果你的内存小于2.5G,就会用到Swap,频繁的Swap切换会加重CPU的Load。

现在我们关掉KeepAliveApache 仍然每秒响应100个用户访问,因为我们将图片、js、css等分离出去了,每次访问只有1个request,此时httpd的进程数是100*1=100个,使用内存100*5M=500M,此时Apache 与Client也是进行了100次TCP连接。性能却提升了太多。

总结:

1、当你的Server内存充足时,KeepAlive =On还是Off对系统性能影响不大。

2、当你的Server上静态网页(Html、图片、Css、Js)居多时,建议打开KeepAlive

3、当你的Server多为动态请求(因为连接数据库,对文件系统访问较多),KeepAlive 关掉,会节省一定的内存,节省的内存正好可以作为文件系统的Cache(vmstat命令中cache一列),降低I/O压力。

PS:当KeepAlive =On时,KeepAliveTimeOut的设置其实也是一个问题,设置的过短,会导致Apache 频繁建立连接,给Cpu造成压力,设置的过长,系统中就会堆积无用的Http连接,消耗掉大量内存,具体设置多少,可以进行不断的调节,因你的网站浏览和服务器配置 而异

不可忽略的apache 的 Keep Alive相关推荐

  1. saltstack 自动化运维管理

    一.简介 saltstack是一个配置管理系统,能够维护预定义状态的远程节点. saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据. saltstack是运维人员提高工作效 ...

  2. 新客户上云 –虚拟机及相关服务常见问题集锦

    本课程汇总了 Azure 新用户上云在虚拟机及相关服务(如磁盘,存储,网络)使用中遇到的常见问题和解决方案. 虚拟机常见问题之系统重启 为什么我的虚拟机会被重启? Azure 平台计划内的维护和升级会 ...

  3. [转载] Python:把字符串转换成整数

    参考链接: SaltStack-工作示例 Saltstack 远程执行 一.命令方式二.文件方式编辑远程执行文件编写远程执行模块使用top文件使用入口文件init.sls 三.使用saltstack安 ...

  4. 【RocketMQ】玩转各种类型的消息

    顺序消息 消息有序指的是可以按照消息的发送顺序来消费(FIFO).RocketMQ可以严格的保证消息有序,可以分为分区有序或者全局有序. 顺序消费的原理解析,在默认的情况下消息发送会采取Round R ...

  5. 企业 Saltstack安装配置及远程推送

    文章目录 Saltstack 概述 通信机制 安装与配置 安装 设置官方YUM仓库安装进行 配置 Saltstack远程执行操作 远程指令操作 编写远程执行模块文件来控制minion 模块使用 远程执 ...

  6. saltstack自动化运维(大规模使用)(一)---C/S架构grainsjinja

    saltstack 1.saltstack(C/S架构)安装与配置 1.1 master端安装 1.2 一主两从的搭建 1.3 查看salt master进程的详细信息 1.4 minion_id的状 ...

  7. 用RocketMQ这么久,才知道消息可以这样玩

    前言 在上一章节中,我们讲解了RocketMQ的基本介绍,作为MQ最重要的就是消息的使用了,今天我们就来带大家如何玩转MQ的消息. 消息中间件,英文Message Queue,简称MQ.它没有标准定义 ...

  8. Flink Kafka

    1.Flink读取kafka策略 读取kafka策略有 org.apache.kafka.clients.consumer.RangeAssignor org.apache.kafka.clients ...

  9. saltstack(1)环境部署、(2)Grains

    文章目录 一.saltstack部署 1.安装和启动 1)准备yum源 2)master和minion安装包 3)master端执行命令允许minion连接 4)master端测试与minion端的连 ...

最新文章

  1. 2019春第一次课程设计实验报告
  2. 动态规划--连续子序列的最大和
  3. pytorch Tensor的操作和Numpy之间的转化(三)
  4. 最小错误率贝叶斯决策
  5. 安防监控应用成LED企业新盈利点
  6. python基础学习(四)if判断语句
  7. django 模型 使用 DateTimeFields 字段 auto_now_add 属性 实现 插入数据时 自动记录时间...
  8. XE7 Unit scope names
  9. 电商扣减库存_竞争激烈的电商市场,小型仓储外包服务解决了中小电商的后顾之忧...
  10. ReentrantLock梳理和总结
  11. Java集合框架关系图
  12. 是香蕉还是芭蕉,芭蕉和香蕉的区别
  13. UML实例(五):在线购物系统设计类图
  14. 人工智能学习-高等数学
  15. javaweb JAVA JSP水费管理系统JSP电费管理系统JSP缴费管理系统JSP水费缴费系统JSP水电费管理
  16. 小程序60s验证码倒计时实现
  17. 【CCF】ISBN号码
  18. springboot+敬老院管理系统 毕业设计-附源码261535
  19. 广东省茂名市谷歌卫星地图下载
  20. 基于javaweb+mysql的医院门诊收费管理系统(java+jsp+jdbc+mysql)

热门文章

  1. 移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网
  2. 匿名函数python_基于python内置函数与匿名函数详解
  3. laravel 5.1 php版本号,发行版本说明 | 序言 | Laravel 5.1 中文文档
  4. Mybatis用#{}从传递过来的参数中取值
  5. html css外接修改无效,HTML外部引用CSS文件为什么会不生效
  6. 福禄克DSX系列教你如何测试铜缆跳线和光纤跳线
  7. 硬件基础:电脑当中各个硬件的作用介绍
  8. 10个适用于Java程序员的有用单元和集成测试工具
  9. T-SQL :SQL Server 定义数据完整性 5大约束
  10. 超融合和服务器关系_超融合与传统服务器区别