Apache 中 Keep Alive 配置的合理使用

在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,可以提高文件系统访问的性能,并且系统会更加稳定。

补充1:

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

补充2:KeepAlive该参数控制Apache是否允许在一个连接中有多个请求,默认打开。但对于大多数论坛类型站点来说,通常设置为off以关闭该支持。

补充3:如果服务器前跑有应用squid服务,或者其它七层设备,KeepAliveOn设定要开启持续长连接

实际在前端有squid的情况下,KeepAlive很关键。记得On

相关推荐