楔子

node-profiler 作为 alinode 团队的另一款产品能够帮助您线下深入分析 javascript 代码的性能,将Google V8的性能细节展现在您的面前,优化而知其所以然。线上调优请使用 alinode

下载安装

推荐安装工具tnvm,支持 node, alinode, profiler 的安装切换。

wget -O- https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh | bash

完成安装后,您需要将tnvm添加为命令行程序。根据平台的不同,可能是~/.bashrc,~/.profile或~/.zshrc.

 tnvm install profiler-v0.12.6
 tnvm use profiler-v0.12.6

使用示例

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200);
  res.end('hello world!');
}).listen(1334);
$ node-profiler server.js
start agent            
webkit-devtools-agent: A proxy got connected.
webkit-devtools-agent: Waiting for commands...
webkit-devtools-agent: Websockets service started on 0.0.0.0:9999  <==启动成功

如出现如下:

Error: listen EADDRINUSE           <== 可能是由于端口被占用

成功启动后,则用chrome(推荐)手动打开url (http://alinode.aliyun.com/profiler/inspector.html?host=localhost:9999&page=0) 出现如下界面:

默认Collect JavaSript CPU Profile,单击Start

可以采用压测脚本实现对服务进行压力测试,保证更多的结果:

$ wrk http://localhost:1334/ # 这里使用wrk,也可以使用其他工具,如ab

点击Stop,得到如下图的结果:

可以看到更多关于函数在运行时的信息。

UI含义

UI 栏目 示意
Self exclusive time
Total inclusive time
# Hidden Classes 隐藏类个数
Bailout v8中提取的最后一次去优化原因
Function 函数名称 script : line

红色表示函数未被优化, 淡绿色表示函数被V8优化过。

原理介绍

  • 基于V8内置采样收集器;
  • 固定采样频率,默认1ms, 可配置;
  • 会暂停主线程,采样函数call stack,统计时间;
  • 需保证采样足够长的时间(预热)。

解释下两个概念

  • exclusive time :独占时间
  • inclusive time :包含时间
function foo() { 
   bar();
}
function bar() {
          <==采样点
}
foo();

这个例子,采样点在bar(),那么bar所消耗的时间叫作 exclusive time,而foo调用了bar, foo所消耗的时间包括了bar的时间,叫作 inclusive time .

注意事项

  • 该工具目前只支持 X64 平台(Linux, Mac)。
  • 切勿部署到线上,如需线上调优请使用 alinode

results matching ""

    No results matching ""