当前位置: 代码迷 >> Web前端 >> 大幅度增高web应用的性能案例
  详细解决方案

大幅度增高web应用的性能案例

热度:254   发布时间:2012-10-30 16:13:36.0
大幅度提高web应用的性能案例


??
前几天,我们就接到其他应用负责人的电话,说我们rate应用http响应超时,导致页面上调用他们json接口的数据也显示很慢。

????????

???????? 观察一下,大吃一惊。

?

???????? 随便打开一张商品的页面,其中的两个json接口超时非常严重,分别是9秒,10秒。????????

?

???????? 再看看监控工具中统计出来的响应时间,如下图:

?

?

???????? 在高峰期,响应时间都快到5秒了。严重影响到了用户体验。

????????

???????? 再看看取数据接口的性能:

?


?

?

即使是从数据库取数据,平均时间连1.5毫秒都不到。这里根本不会是瓶颈。于是把问题定位到了ApacheHttp请求过多,导致响应过慢。

????????

???????? 之前,httpd.cnf的配置是这样的:

???????? =============================================================

???????? Timeout 30

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 10

?

<IfModule worker.c>

???? StartServers???? 5

???? MaxClients?????? 1024

???? MinSpareThreads? 25

???? MaxSpareThreads? 75

???? ThreadsPerChild? 64

???? ThreadLimit????? 128

???? ServerLimit????? 16

</IfModule>

=============================================================

?

MaxClients=1024,表示一个apahce最多只能处理1024个请求。其余的http请求都是浮云,需要等待。

MaxClients的值是由ThreadsPerChild(每个子进程的线程数量) ServerLimit(子进程数量)决定的。

MaxClients = ThreadsPerChild * ServerLimit

如果你把MaxClient设为2048ThreadsPerChild * ServerLimit还是等于1024,是没有效果的。

?

在这次优化中,我们把MaxClient设为2048, ThreadsPerChild设为64, ServerLimit设为32

?

MaxSpareThreads表示最多的空闲线程数。一个请求过来,如果线程池里有现成的线程,就直接处理该

请求,否则创建新的线程。在高峰期rate200多的tps,最多75个空闲线程显然太少了。

于是我们把这个值设为250

?

KeepAlive表示HTTP的一次连接,可以进行多次传输。 rate应用的http场景里,json接口对apache的压力是最大的。

其中一个json接口一天要被访问1700多万次。Json接口一个特性就是只取数据,没有接下来的交互动作。于是我们就把

KeepAlive设为off

?

最后的httpd.cnf配置是这样的:

=============================================================

Timeout 30

KeepAlive off

MaxKeepAliveRequests 100

KeepAliveTimeout 10

?

<IfModule worker.c>

???? ServerLimit????? 32

???? StartServers???? 3

???? MaxClients?????? 2048

???? MinSpareThreads? 25

???? MaxSpareThreads? 250

???? ThreadsPerChild? 64

</IfModule>

=============================================================

?

看看修改后的效果:

?

?

左边的红框框表示昨天的高峰期响应时间,右边表示今天的高峰期响应时间。

优化后的效果是非常非常的明显。

?

最后看看系统的load:

?

?

我们的load比昨天有明显地提高。这是正常的,因为apahce的进程、线程多了。

?

by 毛导

?

1 楼 qwe_rt 2010-12-16  
分析的非常好,赞,ps:我是沙发,
2 楼 silencon 2010-12-16  
apache的配置也是也有研究的啊。。分析的很好,学习了很多这方面的知识,貌似这个工具不错
3 楼 lixjluck 2010-12-16  
非常不错的分析。
楼主能否详细介绍一下keep alive
它是tcp层的,还是http层的
如果我的web server前段还有load balancer,那这个keep alive还有用吗
和四层交换,七层交换,有关系吗
4 楼 csd_ali 2010-12-16  
lixjluck 写道
非常不错的分析。
楼主能否详细介绍一下keep alive
它是tcp层的,还是http层的
如果我的web server前段还有load balancer,那这个keep alive还有用吗
和四层交换,七层交换,有关系吗

keep alive是工作在http层的。
http是工作在tcp之上的。
keep alive设为on时,一次http请求结束时,不会马上关闭tcp连接。在一定时间内,可能还会有http请求,这时就不用再次创建tcp连接,减少创建连接的开销。
keep alive设为off时,一次http请求结束时,马上关闭tcp连接。

不会的。我们公司是用f5的,使用的是三角模式。keepalive是指TCP连接不中断,对于同一个tcp连接肯定是连接同一台服务器的。


5 楼 csd_ali 2011-01-07  
apache设置的keepalive是http层次的,即应用层协议;
那么tcp层(传输层)有keep alive么? 答案是有的。比如我们的ssh,ftp连接都是基于tcp上设置了keep alive的;但是对于tcp来说,keep alive并不是他的标准协议中的;所以一般我们的http请求在tcp层是没有keep alive的;

我们公司使用的F5负载均衡,基于随即策略;并工作在tcp层,不提供keep alive支持。
但是恰巧F5有一个会话保持功能,可以保证一段时间内的同一个客户ip被路由到同一台webserver上去啦。


                              ------老徐
6 楼 myfoot 2011-05-19  
nice!
  相关解决方案