who can help me ~~~ nodejs cpu 100%+,搜遍了百度,Google,没有答案,要学的还太多
发布于 2 年前 作者 bqxu 2889 次浏览 来自 问答

生产环境 倒出来的 cpuprofile, node -v : v6.12.0

va bailout 28598-profiling-1511751398866.json.cpuprofile --only

主要是 TryCatchStatement 和 Yield

Yield 解决方案 说是升到 node8 会好,坑到了,yum 没法升到 8 ,源码安装后,v8-profiler 没法用

TryCatchStatement 程序逻辑里有 throw new CoustomError 实现的,主要是权限控制部分

va timeout 28598-profiling-1511751398866.json.cpuprofile 50 --only

屏幕快照 2017-11-27 下午5.22.33.png

主要是 co , ejs co ,代码里面用的yield function(){}不知道有啥替换方案不 , ejs 的话,模版渲染,有个页面,确实 include 比较多

##导入到 chrome-devtool

屏幕快照 2017-11-27 下午5.14.59.png

就是 promise 比较多 ,代码里面一个逻辑是,一次调用 async.eachLimit 一个请求过来并发10个 调取api,有其他cpu 不高的方式么。

16 回复

搜遍全网,没有找到切实可行的解决方案,或者说压根没找到 nodejs cpu 100% 的答案

具体难得细看了,提供个思路吧。1、检查一下内存,看看内存是否泄漏,内存泄漏会导致不断的gc,cpu就会跑满,看似是cpu的问题其实是内存的问题。2、进入到一个真正耗时的操作,比如死循环。这时配合你的额访问日志去看,确定一下哪个api调用后,导致整个应用服务不了的。沿着这个api的调用关系去排查问题。

@vinnyguitar 嗯嗯,我看看内存吧。唉 cpu 没有啥比较耗时的,基本都是 40,50ms

😳😳感觉要么死循环,要么配置低

来自酷炫的 CNodeMD

@dbit-xia 木有死循环,程序正常,8核8G, 请求数 1,2k 的时候没问题,3,4k+ 的就cpu 103,80 ,50 跳动 。

@bqxu 有台容错的机器,cpu 正常就3%,其他机器每天9点10点,14点,15点,就100% 跳动了,平时也就50%60%

@bqxu
看CPU 的profile 文件,ejs部分重复执行次数最多,查看相应代码: profile文件有显示这行代码 (https://github.com/mde/ejs/blob/master/lib/ejs.js#L201 )被多次重复执行,而执行改行代码的必要前提条件是ejs没有设置cache ,也即 !opt.options == true 那么问题就大了,handleCache函数若 cache 没命中是要从文件系统重新读取模板,然后还要再编译成模板函数的,这两个操作都是异常耗时的操纵(注意ejs的fileLoader是同步读取)

至于为什么没有使用cache 你自己去debug吧,ejs应该没这么蠢,应该是上层代码的问题。

@yyrdl 嗯嗯,好的,谢谢,我在确认一下,之前考虑过这个问题,启动的时候加cache,断点也看过。没有重复compile。我在确认下

@i5ting 已get新技能 ,用的eggjs。view就用的egg-view-ejs。默认已开启cache 。

@yyrdl ejs应该没这么蠢,是我蠢了,在框架里面吧 cache 置为了false ,还是太自负了,debug 果然发现有问题

@bqxu consolidate.js 内置cache的,很多模版引起自己不带或不开启,很正常

@i5ting 我不知道啊,不是我的bug啊,我都不用模板引擎的

@bqxu 是不是得请客呀 :)

@yyrdl 有机会可以啊,求勾搭啊 : )

环境规划激光焊接

回到顶部