最近一个偶然的机会了解到代码剖析分析,何为剖析,我也解释不好就介绍下它的作用,通过作用来理解吧。
比如一个新项目上线,有许多功能,作为开发者和运维人员是不是很想知道各个功能点运行的怎么样,是否有内存泄露,响应是否迅速,各个功能点用户使用的频率等等信息呢?另外如果发现了某一个功能使用起来特别慢,那我们能快速定位到,到底是数据库执行慢,还是代码性能问题,又或者是服务器内存不足频繁交换引起的呢?
想要全方位了解自己的应用在服务器上的运行情况就需要代码剖析,如果交给我们自己设计,恐怕就是在各个可能出问题的地方做钩子,记录运行时间,存入数据库或者写入日志服务器。现在这一切都不用我们自己来操心了,只需要几行代码就可以把这些工作交给 new relic 来做掉。
new relic 就是这样一个应用管理和监控软件,他目前支持很多主流语言,我用的是python和node.js的支持,他支持node.js的express框架,而且用起来非常简单,只需要4步:
1、创建一个 new relic 帐号,免费的哦,不过只能记录24小时的数据
2、安装newrelic包,
npm install newrelic
或者在package.json的写入:(写本文时最高版本是1.10.2)
“dependencies”: {
…
“newrelic”:”1.10.2”
},
3、把node_modules/newrelic/newrelic.js 拷贝到项目根目录,然后修改其中的几个值如下:
/**
- New Relic 客户配置文件.
* - 参考 lib/config.defaults.js 获得更多的配置.
*/
exports.config = {
/**- 应用名称数组,取一个喜欢的名字
*/
app_name : [‘My Application’],
/** - 你的 New Relic 授权 key,在个人中心里把key拷贝进去
*/
license_key : ‘license key here’,
logging : {
/**- 日志等级. ‘trace’ 对于 New Relic 诊断问题时是最有用的
- ‘info’ 级别以及更高的应该应用于生产应用
*/
level : ‘info’
}
};
4、在根目录的app.js中的第一行拷贝加载模块代码:
require(‘newrelic’);
执行完以上4步,等待5分钟就可以在new relic后台看到应用的数据了。
- 应用名称数组,取一个喜欢的名字
1、后台统计总图,最大的图表示事务的平均响应时间,右上角是应用性能指数(apdex score)蓝色表示优异(0.94分以上),绿色表示好,红色表示一般,又下角是系统吞吐率,rpm表示每分钟处理请求数。
2、系统用到的各个应用图,这里我就用到了recmember应用和database数据库,时间表示平均响应时间
3、表示应用花费大部分处理的请求url地址,优化这部分功能可以最有效的提高系统吞吐率
4、下面是用户请求 /view/user/regist 获得注册页面功能的所有耗时和调用次数以及耗时百分比,简单分析一下下图,
因为如果用户是已经注册,则会响应 user_modify.ejs 所以我们看到了会渲染2个view,我们看到这个功能耗时最多的是渲染
user_regist.ejs 这个模版,占据了功能点的43%的时间消耗,所以应该特别优化这部分最有效果。
5、下图是所有数据库操作中平均响应时间最长的
6、点击 insert 操作,我们看到这个操作被调用的时间以及控制器调用此操作的执行时间百分比。
通过new relic的后台提供的数据,我们可以清楚的监控整个应用是否健康的运行,哪里值得优化,对什么地方优化能够得到最大的系统吞吐率提升。
对于使用new relic browser也很简单,步骤如下:
1、在app.js增加如下代码,如果已经加载可忽略:
var newrelic = require(‘newrelic’);
2、在加载完express模块后增加如下代码:
var express = require(‘express’);
var app = express();
…
app.locals.newrelic = newrelic; //写入locals
3、在ejs模版中的head部分增加监控js即可
newrelic.getBrowserTimingHeader()
jade模版如下:
!= newrelic.getBrowserTimingHeader()
4、确保在new relic 的后台设置中是打开 enable browser 选项的
一张图说明一下各个性能参数
另外再分享一个小技巧,默认的时区是美国时间,我们需要在 User preferences 个人设置中将时区设为北京时间,这样就可以了
最后不得不说new relic包的安全问题,可能有朋友会说,这个包会不会留后门,我的服务器会不会成为肉鸡,代码会不会泄露,这个我也无法保证,但是至少要保证运行nodejs程序的权限不要用root。