2、
2、使用 V8 分析器
另一个选项是直接使用 V8 分析器。这种方式会与程序共享进程,因此它会影响程序性能。基于这个原因,请只在你遇到此类问题时运行 V8 分析器来捕获相关输出。该方法的好处是:你可以使用 Chrome 的所有分析工具,结合其输出结果(包括火焰图),对程序进行调查。
请运行以下代码来测试你的程序:
npm install v8-profiler --save之后,在你的程序中添加以下代码:
const profiler = require("v8-profiler")const fs = require("fs")var profilerRunning = falsefunction toggleProfiling () { if (profilerRunning) {const profile = profiler.stopProfiling()console.log("stopped profiling")profile.export() .pipe(fs.createWriteStream("./myapp-"+Date.now()+".cpuprofile")) .once("error", profiler.deleteAllProfiles) .once("finish", profiler.deleteAllProfiles)profilerRunning = falsereturn } profiler.startProfiling() profilerRunning = true console.log("started profiling")}process.on("SIGUSR2", toggleProfiling)只要你发送 SIGUSR2 信号到此进程,它就会开始分析。再次发送一个 SIGUSR2 信号可以停止分析(代码如下)。kill -SIGUSR2 [pid]该进程的分析结果将被写入到当前工作路径的文件中(请确保该路径可被写入)。由于这是一个可编程接口,你可以随意触发它(使用 web endpoint,IPC,等等)。如果你对程序在何时变得缓慢有预感,你可以在任一时期触发该接口。建立自动触发对避免持续监看程序是非常有用的,但是它要求你对捕获时间以及捕获时长有预测性认知。

3、使用进程管理器
尽管直接使用 V8 分析器是非常有效且可定制的,但是它会进入你的代码库,并且会向项目添加又一项你可能不想要的依赖性条件。一种替代方式就是使用进程管理器,它可以在你需要分析时,用各种工具将你的程序包装起来。一种可选的工具是来自 StrongLoop 的 SLC 命令行工具。
首先,运行npm install strongloop –g,然后运行以下代码:
slc start [/path/to/app]上述代码会在进程管理器中启动你的程序,你可以按需提取 CPU 分析数据。要想验证并获取应用程序 id,请运行:
slc ctl你将得到与下面类似的运行结果:
Service ID: 1Service Name: my-sluggish-appEnvironment variables:Name ValueNODE_ENV productionInstances:Version Agent version Debugger version Cluster size Driver metadata 5.0.12.0.21.0.0 1 N/AProcesses:ID PIDWID Listening Ports Tracking objects? CPU profiling? Tracing? Debugging?1.1.61022 6102201.1.61023 610231 0.0.0.0:3000定位应用的进程 id。在此例中,id 为1.1.61023。现在我们就能在任意时间开始分析了,运行如下代码即可:
slc ctl cpu-start 1.1.61023当我们觉得已经捕获到了迟滞行为,就可以运行以下代码来停止分析器:
slc ctl cpu-stop 1.1.61023以下代码将写文件至硬盘:
CPU profile written to `node.1.1.61023.cpuprofile`, load into Chrome Dev Tools好啦,就是这样。你可以像在 V8 分析器里那样把文件加载到 Chrome 里面进一步分析。