我们蝉游记服务器端性能监控一直用 http://newrelic.com/ ,用它的免费版本 N 长时间,有必要为好工具义务宣传一下。
首先你需要在网站上注册一个新帐号,根据服务器端的应用框架选择安装对应的插件,它提供了很多常见应用框架插件,以 Rails 为例子,只需要在 Gemfile 配置,执行 bundle install 即可:
gem 'newrelic_rpm'
然后下载对应的 newrlic.yml 配置文件,放入到应用目录,进行一些参数的调整。将应用重新部署以后,等几分钟,让插件收集到性能相关数据,再去访问 NewRelic 网站,就可以看到各种图表了。
首先需要关注的是请求的响应时间图表,用这个图表可以对请求在服务器端耗时有个整体印象: 从图表上可以看到,在这个时间段,请求的平均耗时是 52ms,同时可以看到每个请求的 Ruby 代码和数据库执行时间占据了绝大部分,还有少量的外部服务调用时间(比如第 3 方 Oauth 或者 API)。由于我们使用 OOB GC,所以在图表上几乎没有 GC 的时间。
另外右上角有一个 3.58s 的浏览器时间,这个是指用户访问网页,从请求发出,到整个页面完全加载完成(包括图片,css,js 等)。
第二个图表是 Apdex (Application Performance Index),从这里可以看到大部分用户是否满意你的应用响应速度:
从图表可以看到,99% 的用户非常满意请求响应时间(在我们的应用里面,大部分请求是客户端调用 api),93% 的用户非常满意页面加载完成的时间。我们用的指标是 NewRelic 默认设置的 500ms 和 7s,你还可以自己进行调整。
第 3 个图表是吞吐量 可以看出在这半个小时的区间,平均每分钟有 1050 个请求。用这个图表,通过調整时间段(,了解整个应用什么时候是高峰,什么时候是低谷,方便将一些批处理,备份等任务放在访问低谷的时间段进行。还有当用户报告无法访问的时候,可以通过查看吞吐量是否有急剧下降,来判断是个例还是整体故障,来确定解决问题的优先级。免费版本的 NewRelic,只能查看过去 24 小时的数据,升级到付费帐号,可以查看所有的历史数据。
第 4 个图表是根据请求的时间和请求的次数,列出一个最耗时的请求 我们可以根据这个排列顺序,来考虑对于访问量大,同时又耗时的请求进行重点性能优化。 点击具体的请求,还可以看到请求耗时的分布情况: 从图表上可以看到这个请求,在渲染 json 数据耗费了比较多的时间,另外在 ActiveRecord 的查询上也耗费了一些时间,如果要优化的话,就可以从渲染结果加片段缓存,或者查询优化入手。升级到付费版本,还能查看到具体的 sql 语句执行情况,如果有 slow query,还能显示 explain 的结果。
第 5 个图表,是错误率 在我们应用中引发错误的大部分是一些爬虫 404,还有一些是异常数据没有处理好导致,这里就不详细介绍了。这个图表对于用户反馈错误定位也是很有帮助的。
第 6 个图表,是应用性能分布到各个服务器状态 对于了解服务器资源和扩容计划很有帮助。顺便说一个实际遇到的事情,发现过某台主机(我们用的云主机)的响应时间就是比其他台要慢 50% 以上,对比发现这台的 CPU 和 Disk IO 都比其他台要弱,后来报告给云主机服务商,通过迁移到了新的物理机解决了。
除了上述的这些性能图表,NewRelic 也提供了很多监控的选项,比如 ping,内存/存储警报等,可以将报警发送到邮件,或者推送到移动客户端:
这里就简单介绍一下它免费版本的少量功能,更多的功能留待大家去玩吧。最后还要提一下最喜欢的 scalability report 和 database report,可以申请试用付费帐号来体验,是我见过最赞的报表了。
我在 padrino 项目里也基本是按照 rails 的方式配的,加上 gem 和 yml 配置就跑起来了,但是在显示请求响应时间那里只显示出来 middleware 和 ruby 的执行时间,需要额外的配置么?
#26 楼 @quakewang 我没说清楚。我指的是 load balancer 的 health check(比如 aws 的 ELB), 基本是每秒钟 ping 一下后端的 web 服务器/status 来决定后端的 web 服务器是不是状态良好,如果不好就从 server pool 里面去掉。如果有 3 台 web 服务器,那么 newrelic 的 rpm 就会增加 3*60=180。当然确实也不是很大。
#27 楼 @quakewang 我只用了 mongoid,看来是不识别的,统统记为 middleware,而且有的请求是要持续 1-2s 的主要是花在 imagemagick 的处理上也都计到了 ruby 上,还提示了 Missing GC timings
,额,不细分析的话还是挺直观的
这货还可以监控 server , 我们是连 server 运行状况一起用 NewRelic 来监控的。比如说磁盘使用量,CPU 占用率,Memcached 内存使用量,这些可以设置阀值,如果超过了就给我们发邮件。感觉还是比较方便。
#34 楼 @loveltyoic 用 newrelic-grape 这个 gem,不过这个 gem 写得不是很好,newrelic 的开发也和这个 gem 的作者提过了,应该又改进的空间。