Rails应用比较容易遇到的两类性能问题:一类是Rails执行很慢,CPU消耗过高;另一类是Rails进程内存泄漏。解决这两类问题都需要你首先能够精确定位出现问题的代码,然后才知道如何对症下药。
一、如何监控Rails进程的执行性能
定位消耗CPU高,执行速度缓慢的Rails代码,是相当容易的事情,仅仅需要你对production.log做一点统计分析,抽取出来执行时间最长的请求,问题就昭然若揭了。由于production.log对Rails请求的执行时间做了详细的统计,例如:
Ruby代码
Completed in 0.00693 (144 reqs/sec) | Rendering: 0.00489 (70%) | DB: 0.00000 (0%) | 200 OK [http://www.javaeye.com/]
Completed in 0.17238 (5 reqs/sec) | Rendering: 0.10011 (58%) | DB: 0.06244 (36%) | 200 OK [http://www.javaeye.com/topic/49441?page=7]
Completed in 0.20508 (4 reqs/sec) | Rendering: 0.19373 (94%) | DB: 0.00645 (3%) | 200 OK [http://www.javaeye.com/news/1586]
所以我们只需要写一行shell命令,就搞定了!他把最耗时的前500个请求筛选出来,保存到timing.log里面。
Ruby代码
grep "200 OK" production.log | awk '{print "ALL: " $3 " View: " $8 " DB: " $12 " URL: " $17 }' \
| sort -r | head -n 500 > timing.log
排序好的结果例如:
Ruby代码
ALL: 5.51774 View: 5.38277 DB: 0.13338 URL: [http://www.javaeye.com/wiki/topic/131966]
ALL: 5.51316 View: 5.31300 DB: 0.19400 URL: [http://www.javaeye.com/wiki/topic/145383]
ALL: 5.51311 View: 5.39321 DB: 0.11234 URL: [http://www.javaeye.com/wiki/topic/160370]
ALL: 5.51135 View: 5.37604 DB: 0.12652 URL: [http://www.javaeye.com/wiki/topic/233365]
ALL: 5.49881 View: 5.35998 DB: 0.10637 URL: [http://www.javaeye.com/wiki/topic/265217]
哪些请求执行的慢,一目了然。当然除此之外,我们还可以实时监控,在top监视窗口显示Rails当前正在执行的请求URL。