0个
单指令的火焰图剖析
发现密码中的瓶颈和热路,用火焰图.
可视化堆栈跟踪
0x 可配置和生成一个具有单一命令的节点进程的交互式火焰图,
在任何节点运行的平台上(macOs, Linux, Windows, Android...).
支助
- 节点v20.x及以上
- 默认使用支持节点运行的任何操作系统 !
- 颜色
- 其他浏览器可能打开已退化但功能形式的火焰图
安装
npm install -g 0x
使用量
使用 0x 运行脚本 :
0x my-app.js
立即打开浏览器中的火焰图 :
0x -o my-app.js
自动针对第一个配置命令执行 通过配置进程打开的端口 :
0x -P 'autocannon localhost:$PORT' my-app.js
使用自定义节点可执行文件 :
0x -- /path/to/node my-app.js
将自定义参数传递到节点 :
0x -- node --zero-fill-buffers my-app.js
用于 pwsh 用户, 初切换到 CMD 或用
npx
npx 0x -o my-app.js
正在生成
准备生成火焰图时,发送SIGINT或SIGTERM.
最简单的方法是按下 CTRL+C.
何时 0x 它处理堆栈和
生成配置文件夹( e)<pid>.0x),包含 flamegraph.html。 。 。 .
乌干达
这个 flamegraph.html 文件包含 0x 用户界面,其解释如下:
文献/文献。 。 。 .
生产服务器
轻量级、生产服务器友好型、生成 火焰图描述于 文件/生产服务器。 。 。 .
配置文件夹
默认情况下,将创建一个配置文件夹,并以 PID 命名,例如.
3866.0x (我们可以使用 --output-dir 旗帜).
Profile 文件夹将在 文件/档案文件夹
示例
切开这个回放,运行 npm i -g 从还原根运行
0x examples/rest-api
在另一个标签运行中
npm run stress-rest-example
在服务器上加载,一旦完成 使用 ctrl + c 来杀死服务器.
命令行 API
帮助 qq-h
打印使用信息.
打开..
在浏览器中打开火焰图 open 或者说 xdg-open (见
https://www.npmjs.com/package/open (中文(简体) ) 详细情况请查阅.
-在港口上 - -P
运行给定的命令并生成火焰图 .
指定的命令可访问 a $PORT 变量.
这个 $PORT 变量是按照第一个端口设置的
配置进程打开 .
例如,这里有一个使用 自定义 以加载测试进程 :
0x -P 'autocannon localhost:$PORT' app.js
当负载测试完成后,处理的配置文件将 发送了 SIGINT , 火焰图将自动生成 .
记住要用单引号来避免被戳入,
或者其他的逃生变量(例如:. 0x -P "autocannon localhost:$PORT" app.js
没用的 0x -P "autocannon localhost:\$PORT" app.js 页:1.
注意: 在 Windows 插值上通常发生 %PORT%不过
在这种情况下,美元前缀 $PORT 是正确的语法
(因为内插不是基于外壳).
默认 : ''
名称
HTML 文件的名称, 没有. html 扩展名
能够设置为 - 将 HTML 写入 STDOUT( 注)
由于CLI 参数解析的性质,必须使用 =, (中文(简体) ),
譬如说. --name=-) (中文(简体) ).
如果这面旗帜或者 --output-html-file 设置为 -
然后 HTML 将转到 STDOUT.
默认: 火焰图
标题
设置要显示在 Flashgraph UI 中的标题 .
默认: 0x 运行启动进程的命令
-- 输出- dir QQ- D
指定文物输出目录。 可在模板中指定
可能变量的窗体 {pid}, (中文(简体) ), {timestamp}, (中文(简体) ), {name}
(基于 --name 旗帜)和 {outputDir}(可变数)
必须在没有空白的情况下指定,例如. { pid } 不被支持.
默认 : {pid}.0x
--output-html QQ-F 数据输入
指定生成的 Flashgraph HTML 文件的去向.
可用可能变量的模板形式指定
状态 {pid}, (中文(简体) ), {timestamp}, (中文(简体) ), {name} (基于 --name 旗帜)和
{outputDir} (可变性必须指定,不设空格,
譬如说. { pid } 不被支持。 也可以设定为 - 改为
将 HTML 输出发送到 STDOUT (注)
由于CLI 参数解析的性质,必须使用 =, (中文(简体) ),
譬如说. --output-html=-) (中文(简体) ).
如果这面旗帜或者 --name 设置为 -
然后 HTML 将转到 STDOUT.
默认 : {outputDir}/{name}.html
--内核追踪
使用OS内核跟踪工具(perf on Linux). 这个能捕捉到 本地堆栈框架(C++模块和Libuv I/O), 但是由于编译器优化,可能导致从Node.js中缺少堆栈.
见 文件/内核追踪 更多信息.
默认: 假
- 安静..
限制输出, 唯一的输出将是致命错误或
路径 flamegraph.html 以成功的一代盟誓.
默认: 假
安静 安静
除致命错误外, 禁止所有输出 .
默认: 假
仅收集
不要生成火焰图, 只创建配置文件夹, 包括相关产出.
默认: 假
-- 收起- 延迟
相对于第一个条目,将堆栈的收集延迟到指定的时间(ms) .
默认: 0
-- 只可视化
提供用于构建或重建可视化的配置文件夹路径 从原始堆栈.
默认: 未定义
——可视化-可视化
提供 CPU 配置文件的路径(.cpuprofile) (中文(简体) ). 见 examples/cpu-profile 用于实例.
CPU 配置文件 输出没有那么多信息,但可以从浏览器中的Chrome Devtools中导出. 也有一个自动化的无头工具来做到这一点: 自动染色图示。关于在节点创建节点.js Cpu 配置文件,参见 v8 显示器 或者说 v8 显示器 - next。它们也可以使用命令行旗从12号及以上节点生成 --cpu-prof。 。 。 .
默认: 未定义
--内核跟踪调试
显示 perf(1) 工具的输出 .
默认: 假
-- 树木调试
将捕获到的微量输出的中间树代表保存到 JSON 文档.
默认: 假
程序化 API
0x也可以作为节点模块要求并被脚本:
const zeroEks = require('0x')
const path = require('path')
async function capture () {
const opts = {
argv: [path.join(__dirname, 'my-app.js'), '--my-flag', '"value for my flag"'],
workingDir: __dirname
}
try {
const file = await zeroEks(opts)
console.log(`flamegraph in ${file}`)
} catch (e) {
console.error(e)
}
}
capture()
程序化的API详见: 文件/附录。 。 。 .
解决问题
记忆问题
有很多堆叠的非常复杂的应用可能会触及内存问题.
这个 --stack-size 旗帜可以用来设置内存到最大 8GB
为了在剖析时围绕这一点开展工作:
node --stack-size=8024 $(which 0x) my-app.js
在克罗姆还是有问题打开火焰图 同样的工作
从命令行( 平台依赖) 打开 Chrome 即可使用
并筑巢 --stack-size 旗帜 --js-flags 旗帜 :
--js-flags="--stack-size 8024"。 。 。 .
调试
DEBUG=0x* 0x my-app.js
替代品
- https://github.com/brendangregg/FlameGraph 页面存档备份,存于互联网档案馆 (佩尔)
- https://www.npmjs.com/package/stackvis 页面存档备份,存于互联网档案馆 (节点)
- https://www.npmjs.com/package/d3-flame-graph (英语) (节点)
鸣谢
本作最初的赞助商是: 临近格式
此工具来自各种信息和代码来源 并且会花费更长的时间 没有以下的人和 其开放源码/信息分享工作:
- 托尔斯滕·洛伦兹(英语:http://thlorenz.com/ (原始内容存档于2018-09-29)(中文(简体) )
- 戴夫·帕切科(英语:http://dtrace.org/blogs/dap/about/ (中文(简体) )(中文(简体) )
- 布兰登·格雷格(英语:http://www.brendangregg.com/ (中文(中国大陆) )(中文(简体) )
- 马丁·斯皮尔(Martin Spier)http://martinspier.io/ (中文(简体) )(中文(简体) )
许可证
麻省理工学院