`

不可忽略的Keep Alive

阅读更多

在网页开发过程中,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模式)。MaxKeepAliveRequestsKeepAliveTimeOut 两个属性在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连接,消耗掉大量内存,具体设置多少,可以进行不断的调节,因你的网站浏览和服务器配置 而异。

1
0
分享到:
评论

相关推荐

    Nginx超时设置.docx

    其中,超时设置是非常重要的一个方面,对于提高用户体验、优化性能以及确保服务的稳定性都有着不可忽视的作用。 #### 二、超时设置类型 Nginx 提供了多种类型的超时设置,这些设置主要分为两大类:客户端超时和...

    MQTT调试软件.rar

    总的来说,MQTT调试软件是开发和维护MQTT协议应用不可或缺的工具,尤其在结合ESP8266这样的硬件平台时,它能帮助开发者快速定位和解决问题,提升物联网设备的性能和稳定性。通过熟练掌握这款软件,你将能够更有效地...

    HttpClient Https实战

    这篇博客“HttpClient Https实战”很可能详细介绍了如何使用HttpClient库来处理HTTPS连接,这是在互联网安全通信中不可或缺的一部分。 HttpClient库提供了丰富的API,使得开发者可以方便地发送GET、POST等各种HTTP...

    线程池源码

    线程池是Java多线程编程中不可或缺的一部分,它通过管理一组可重用线程来提高应用程序的性能和效率。在Java中,`java.util.concurrent` 包中的 `ExecutorService` 和其子类如 `ThreadPoolExecutor` 提供了线程池的...

    线程池简单实现chenjiegui

    线程池是一种多线程处理形式,用于...总的来说,线程池是多线程编程中不可或缺的一部分,它通过有效地管理和调度线程,提升了程序的效率和稳定性。正确理解和使用线程池,对于提升Java应用的性能和健壮性具有重要意义。

    Java线程池介绍Java开发Java经验技巧共8页.pd

    理解并熟练运用Java线程池,不仅可以提升程序性能,还能有效控制并发问题,是Java开发中不可或缺的一项技能。在实际开发中,要结合具体业务场景,灵活选择和配置线程池,以实现最优的并发处理效果。

    XTS3000写频软件英文单词翻译

    7. **Emergency**:紧急模式设置,包括Silent Alarm(静默警报)和Keep Alive(保持活动)功能,确保在紧急情况下电台仍能正常工作。 8. **Unmute Option**:在紧急模式下,电台是否应该解除静音。 9. **Emergency...

    nginx超时设置详细介绍

    最后,`proxy_upstream_fail_timeout`设置了当upstream后端服务器在指定次数失败后,不可操作的时间长度。默认为10秒。 通过本文档提供的详细配置说明,可以看出,合理设置Nginx超时参数是确保Web服务稳定运行的...

    XTS3000说明

    - **Keep Alive**:即使在紧急模式下,启用此选项可使电台始终保持工作状态,不受开关位置的影响。 - **Unmute Option**:未明确说明,可能是指在特定情况下取消静音的选项。 - **Emergency Channel Selector ...

    sqlmap语句.doc

    - `--keep-alive`: 使用持久HTTP(S)连接,减少连接建立时间。 - `--null-connection`: 从没有实际响应体的HTTP响应中获取页面长度。 - `--threads=THREADS`: 设置最大并发HTTP(S)请求的数量,默认为1。 5. **...

    Vue的实践项目——仿饿了么外卖.zip

    在开发过程中,开发者还需要关注性能优化,例如懒加载组件、使用Vue的`<keep-alive>`组件缓存不常改变的页面、以及利用Vue Router的守卫功能进行权限控制。此外,测试和调试也是项目开发中的重要环节,可以使用Vue ...

    网站下载工具wget.

    若需要关闭此功能,可使用`--no-http-keep-alive`选项。 5. **用户代理伪装**:使用`--user-agent`选项,可以设置wget模拟不同的浏览器发送请求,这对于某些限制特定用户代理的网站非常有用。 6. **时间戳比较**:...

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,...

    vuejs-cheatsheet

    - **keep-alive**: 缓存不活动的组件实例。 - **slot**: 插槽。 #### v-model 的修饰符 Vue 的 v-model 提供了一些有用的修饰符来改变输入行为: - **lazy**: 使用 change 事件触发更新。 - **number**: 自动将...

    BitTorrentSpecification v1.0.pdf

    - **10.5.1 keep-alive:** 表示空消息,用于保持连接活动状态。 - **10.5.2 choke:** 表示对端节点被“扼制”,即不再接收数据。 - **10.5.3 unchoke:** 表示取消对端节点的“扼制”,即可以继续接收数据。 - **...

    摩托罗拉XTS3000写频软件

    Keep Alive :选中此项电台在紧急模式下将会保持工作,不管开关的处于何种位置。 Unmute Option : Emergency Channel Selector Lock :选中此项,电台如果在紧急模式工作,将会锁定在紧急信道上。 ...

Global site tag (gtag.js) - Google Analytics