CNode

node 如何采集C++和底层CPU profile

问答
LLiuWeiMr发布于5 年前最后回复5 年前8 回复4225 浏览0 收藏

遇到了一个线上问题,情景: 配置:2核4G 启动:pm2 启动2个进程 服务逻辑:只运行内部逻辑,不产生网络I/O,外部http请求已经mock,没有使用mysql、redis等外部组件 QPS在200就发生CPU超过100%,对压测时进行CPU profile 分析,program进程(也就是C++库和Node底层库)占比最大,达到了47%这部分如何采集CPU profile进行进一步分析,还有各位大佬有没有其他思路分析解决这个问题

查看回复

回复 (9)

I
i5ting#1·5 年前

看一下easy-monitor

L
LiuWeiMr#2·5 年前
引用 i5ting看一下easy monitor

@i5ting 我看看,大佬

H
hyj1991#4·5 年前

想看 native 的得在启动前加上 --prof 这个 flag,然后用 0x 查看分析结果 v8 自带的 cpuprofiler 只能采集 js stack

H
hyj1991#5·5 年前

另外,program 指的是 v8 的 cpuprofiler 采样线程采样的时候没有 js code 在执行,也不一定全都是 cpu 占用(比如 epool wiat 这种),倒是 profile 里的 js 部分是切切实实的 cpu 占用,既然你的 program 只占了 47%,你应该先看看 js 部分的调用栈有没有能优化的

L
LiuWeiMr#6·5 年前
引用 hyj1991另外,program 指的是 v8 的 cpuprofiler 采样线程采样的时候没有 js code 在执行,也不一定全都是 cpu 占用(比如 epool wiat 这种),倒是 prof...

@hyj1991 JS部分很碎片化,占1.9%,0.5这样,这样的有100+以上,没有占用过大的。压测到直至QPS上不去了,应该不是epool wait。

L
LiuWeiMr#8·5 年前
引用 hyj1991@LiuWeiMr 要看聚合火焰图

@hyj1991 火焰图调用栈最顶层都是1.1ms这样,我理解是正常的,火焰图里也显示gc和program占比比较高。分析JS调用栈,耗时比较高的是processTicksAndRejectionsinternal这种底层函数,也定位不到是哪个函数调用导致的

X
x1911#9·5 年前

有没有可能是某个库的问题,

我们上个项目用了一个使用WebRTC来发UDP包的库,开发一切正常,也是上线后出问题, 具体表现是7天左右,就会突然出现100%跑满cpu,查日志看 cpuprofiler 都正常, 发现问题后,由于难复现,原作者也没解决,只能放弃这个库

参与回复
登录后即可参与回复。登录