大幅度提高web应用的性能案例
?? 前几天,我们就接到其他应用负责人的电话,说我们rate应用的http响应超时,导致页面上调用他们json接口的数据也显示很慢。
????????
???????? 观察一下,大吃一惊。
?
???????? 随便打开一张商品的页面,其中的两个json接口超时非常严重,分别是9秒,10秒。????????
?
???????? 再看看监控工具中统计出来的响应时间,如下图:
?
?
???????? 在高峰期,响应时间都快到5秒了。严重影响到了用户体验。
????????
???????? 再看看取数据接口的性能:
?
?
?
即使是从数据库取数据,平均时间连1.5毫秒都不到。这里根本不会是瓶颈。于是把问题定位到了Apache。Http请求过多,导致响应过慢。
????????
???????? 之前,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设为2048,ThreadsPerChild * ServerLimit还是等于1024,是没有效果的。
?
在这次优化中,我们把MaxClient设为2048, ThreadsPerChild设为64, ServerLimit设为32
?
MaxSpareThreads表示最多的空闲线程数。一个请求过来,如果线程池里有现成的线程,就直接处理该
请求,否则创建新的线程。在高峰期rate有200多的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 毛导
?
3 楼 lixjluck 2010-12-16 非常不错的分析。