引言
  为什么我会写这一篇博客,因为近很多京东云擎jae的用户反应一个问题是他们部署在jae上面的应用访问很慢,有极少数应用甚至经常出现504超时现象,当然大家首先想到的是jae性能太差,这也是人之常情,往往出现什么错误的时候首先想到是别人的不好,工作中很多同事也是这样,如果软件系统出现一个bug首先怀疑的肯定不是自己写的代码。花时间写这一篇博客主要是告诉大家怎样确定我们部署在PAAS平台(不仅仅是JAE哦)web应用为什么慢?慢在哪儿了?有什么方法可以解决?
  原因分析
  出现访问自己web应用慢从宏观上可以总结为下面三点:
  (1)网络慢:具体来说是访问者同部署web应用的PAAS平台之间的网络慢;
  (2)PAAS平台性能出现问题:具体来说是由于各种原因导致PAAS平台不能很好服务部署在它上面的应用;
  (3)web应用本身慢:由于各种原因(频繁读写磁盘,大量耗时的计算,资源竞争等)导致web应用不能很快的响应访问者的请求。
  上面三点主要总结于web应用的访问路径,因为访问PAAS平台的web应用首先需要经过网络,然后经过PAAS平台的过滤和转发等处理,后才到达web应用本身处理。这三个环节任何一个出现问题都会导致web应用访问变慢。知道原因了,我们还需要判断到底是哪一个环节出现了问题,下面说说怎样定位具体的环节。
  定位具体原因
  上面分析的三个原因除了第二个原因以外,大家都可以自己定位和排除,首先检查网络,为了更加准确我们可以从一下方面进行排除:
  (1)首先检查访问其他网站是否出现很慢的现象,如果很快,那么说明你的网络肯定大体上是正常的;
  (2)访问对应PAAS平台提供的相关网站和PAAS平台所属公司的网站,例如JAE,你可以访问京东商城主站和京东云平台首页等,BAE可以访问百度相关网站,SAE可以访问新浪相关网站,因为这些关联网站一般部署在同一个机房或者同一个城市,如果这些网站也很慢,那多半说明这些网站相关机房网络出现问题或者访问量很大,导致这些网站对外出口流量和访问速度变慢,也是对外提供服务的能力扛不住了,如果没有问题,那么可以排除大的网络环境是没有问题的;
  排除了网络因素,我们可以排除后面两个原因了,由于PAAS平台的性能对用户基本上是透明的,是用户基本上无从得知,所以可以直接跳过这个原因的排除,当然其实是有手段的,只是稍微复杂,所以不方便所有用户,如果是这种原因好还是交给PAAS平台的开发人员去处理。
  后一个原因当然是web应用自身的实现了,我发现很多用户反馈的网站访问慢的原因都是由于自己代码实现的问题。
  首先出现问题的网站大多数是有一定访问量的,特别是某一个时间段出现访问量巨大,而且频繁读写磁盘。为了定位这种原因希望大家把应用部署在自己本地使用web性能测试工具做验证即可,例如比较常用的web性能测试工具ab,这个事apache自带的测试工具,ubuntu下安装和使用都非常方便,例如我们直接在控制台中输入ab,如果没有安装,ubuntu系统会如下提示:
  The program 'ab' is currently not installed.  You can install it by typing:
  sudo apt-get install apache2-utils
  然后安装提示安装即可,安装成功以后我们可以使用ab软件对我们部署在本地的web应用进行性能测试评估了,命令如下:
  ab -n1000 -c10 http://localhost/
  上面命令的意思是总共发送1000次请求,每次10各并发请求,访问的路径是本地web服务器的根路径,结果如下:
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software:        Apache/2.4.6
Server Hostname:        localhost
Server Port:            80
Document Path:          /
Document Length:        177 bytes
Concurrency Level:      10
Time taken for tests:   0.075 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      446000 bytes
HTML transferred:       177000 bytes
Requests per second:    13283.74 [#/sec] (mean)
Time per request:       0.753 [ms] (mean)
Time per request:       0.075 [ms] (mean, across all concurrent requests)
Transfer rate:          5785.69 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     0    1   0.2      0       2
Waiting:        0    0   0.2      0       2
Total:          0    1   0.1      1       2
ERROR: The median and mean for the processing time are more than twice the standard
deviation apart. These results are NOT reliable.
Percentage of the requests served within a certain time (ms)
50%      1
66%      1
75%      1
80%      1
90%      1
95%      1
98%      1
99%      1
      2 (longest request)