遇到了一个线上问题,情景: 配置:2核4G 启动:pm2 启动2个进程 服务逻辑:只运行内部逻辑,不产生网络I/O,外部http请求已经mock,没有使用mysql、redis等外部组件 QPS在200就发生CPU超过100%,对压测时进行CPU profile 分析,program进程(也就是C++库和Node底层库)占比最大,达到了47%这部分如何采集CPU profile进行进一步分析,还有各位大佬有没有其他思路分析解决这个问题
看一下easy-monitor
@i5ting 我看看,大佬
想看 native 的得在启动前加上 --prof 这个 flag,然后用 0x 查看分析结果 v8 自带的 cpuprofiler 只能采集 js stack
另外,program 指的是 v8 的 cpuprofiler 采样线程采样的时候没有 js code 在执行,也不一定全都是 cpu 占用(比如 epool wiat 这种),倒是 profile 里的 js 部分是切切实实的 cpu 占用,既然你的 program 只占了 47%,你应该先看看 js 部分的调用栈有没有能优化的
@hyj1991 JS部分很碎片化,占1.9%,0.5这样,这样的有100+以上,没有占用过大的。压测到直至QPS上不去了,应该不是epool wait。
@LiuWeiMr 要看聚合火焰图
@hyj1991 火焰图调用栈最顶层都是1.1ms这样,我理解是正常的,火焰图里也显示gc和program占比比较高。分析JS调用栈,耗时比较高的是processTicksAndRejectionsinternal这种底层函数,也定位不到是哪个函数调用导致的
有没有可能是某个库的问题,
我们上个项目用了一个使用WebRTC来发UDP包的库,开发一切正常,也是上线后出问题, 具体表现是7天左右,就会突然出现100%跑满cpu,查日志看 cpuprofiler 都正常, 发现问题后,由于难复现,原作者也没解决,只能放弃这个库
。
@x1911 不确定,这是第一次压测,历史项目已经很复杂了,用了很多库