Dragon
  • 本博客商城免登录支付购买BUG已经修复恢复正常,谢谢您的惠顾!
  • 注册、登陆后即可全站无广告畅快浏览本博客了!
  • 本博客已开启支持百度AI智能内容自动审核机制!
明月登楼明月登楼  2017-03-07 08:00 明月登楼的博客 隐藏边栏 |   24 条评论  4,109 
文章评分 0 次,平均分 0.0
导语: 当 KeepAlive=On 时,KeepAliveTimeOut 的设置其实也是一个问题,设置的过短,会导致 Apache 频繁建立连接,给 Cpu 造成压力,设置的过长,系统中就会堆积无用的 Http 连接,消耗掉大量内存,具体设置多少,可以进行不断的调节,因你的网站浏览和服务器配置而异。

在网页开发过程中,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 还是要具体问题具体分析的,在生产环境中的影响还是蛮大的。

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

[ad]

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

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

前面提到过,Keep Alive=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。

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

总结:

  • 1、当你的 Server 内存充足时,Keep Alive=On 还是 Off 对系统性能影响不大。
  • 2、当你的 Server 上静态网页(Html、图片、Css、Js)居多时,建议打开 Keep Alive。
  • 3、当你的 Server 多为动态请求(因为连接数据库,对文件系统访问较多),Keep Alive 关掉,会节省一定的内存,节省的内存正好可以作为文件系统的 Cache(vmstat 命令中 cache 一列),降低 I/O 压力。

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

附赠.htacess 里开启 Keep Alive 代码:

-alive

「点点赞赏,手留余香」

还没有人赞赏,快来当第一个赞赏的人吧!

明月登楼给明月登楼打赏
×
予人玫瑰,手有余香
  • 2
  • 5
  • 10
  • 20
  • 50
2
支付

本文来自投稿,不代表明月登楼的博客立场,版权归原作者所有,欢迎分享本文,转载请保留出处!

明月登楼
明月登楼 关注:9    粉丝:0 最后编辑于:2019-07-06
玉满斋(www.ymanz.com)网站创始人,☑玉器爱好者 ☑微博控 ☑手机控 ☑历史控 ☑宅 ☑网络控 ☑Wordpress控

发表评论

表情 格式 链接 私密 签到
评论
正在努力加载中...
扫一扫二维码分享