[eggjs/egg]egg部署在线上环境,偶发性CPU居高不下

2025-11-04 286 views
1
What happens? egg部署在线上环境,偶发性CPU居高不下,卡死无法正常访问到应用 偶发情况非常不确定,但是可以确定不是访问并发量高引起的 重启应用方可恢复正常 复现步骤,错误日志以及相关配置

pf-ae-mb-web.log.2019-01-01 应用访问日志 2018-12-30 21:53:55,560 INFO 13657 [-/10.21.20.88/-/1354ms GET HTTP/200 9029 - 1353 - Mozilla/5.0 (iPad; CPU OS 9_3_5 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G36 Safari/601.1 2019-01-01 13:53:31,699 INFO 6373 [-/10.21.20.88/-/210ms GET /home] [access] 116.21.94.93: - GET /home HTTP/200 25011 203 - Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; MI 6 Build/OPR1.170623.027) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.4.5

2019-01-01 13:53:31 这个时间段重启方有正常的访问日志进来,即2018-12-30 21:53:55~2019-01-01 13:53:31应用无法正常访问,访问页面出现504超时

查日志追查到,以下错误信息: 2018-12-30 20:53:20,831 ERROR 13645 nodejs.ClusterClientNoResponseError: client no response in 69985ms exceeding maxIdleTime 60000ms, maybe the connection is close on other side. at Timeout.Leader._heartbeatTimer.setInterval [as _onTimeout] (/node_modules/cluster-client/lib/leader.js:73:23) at ontimeout (timers.js:469:11) at tryOnTimeout (timers.js:304:5) at Timer.listOnTimeout (timers.js:264:5) name: 'ClusterClientNoResponseError' pid: 13645 hostname: Nodejssa253

2018-12-30 21:54:40,937 ERROR 13645 nodejs.ClusterClientNoResponseError: client no response in 60022ms exceeding maxIdleTime 60000ms, maybe the connection is close on other side. at Timeout.Leader._heartbeatTimer.setInterval [as _onTimeout] (/node_modules/cluster-client/lib/leader.js:73:23) at ontimeout (timers.js:469:11) at tryOnTimeout (timers.js:304:5) at Timer.listOnTimeout (timers.js:264:5) name: 'ClusterClientNoResponseError' pid: 13645 hostname: Nodejssa253

已尝试接入alinode,但接入后,阿里云控制后台莫名失去应用实例的显示与监控 相关环境信息

操作系统: Linux version 2.6.32-642.15.1.el6.x86_64 (mockbuild@c1bm.rdu2.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-17)

Node 版本: v8.5.0

Egg 版本: "version": "1.13.1"

回答

0

排查一下业务代码看一下有没有造成内存泄漏的逻辑,内存满了会引起 node 进行频繁 gc ,就会导致 cpu 飙升,很大概率是业务代码有问题导致的

3

如果容易重现可以在有问题的时候看一下 node 进程的内存和 CPU 占用是怎样的。另外你用什么方式接入 Alinode 的?

1

就是不容易重现啊。。。什么时候出现、出现的时机都是无法确定的

接入alinode,通过服务器那边去接入的,不是通过项目接入

0

不复现的话我们也没办法跟进啊。

代码里面有没有 sync 之类的代码

6

接入 alinode 后,根据 快速设置告警规则 设置一下 CPU 报警阈值,比如默认是 单进程 CPU 使用超过 80% 的时候告警。

那么等你收到告警短信的时候,上 Node.js 性能平台的控制台,对目标 CPU 高的进程做一个 CPU Profile,然后观察 CPU 耗费在什么地方。

像这种 CPU 高的问题,单纯给代码是没有用的,如果有 CPU Profile 等信息,倒是可以看一下

9

另外,看你描述是卡死,很可能有类似正则回溯引发的类死循环,因为 Node 是单工作 JS 主线程的运行模型,所以会阻塞住后续的用户访问,导致看起来好像是卡死的状态。

这个问题可以用性能平台提供的 诊断报告 功能进行确认,详细可以参考 死循环和正则攻击定位

7

sync

代码没有使用sync的

4

接入 alinode 后,发现alinode进程长时间CPU超100%,居高不下,但是应用能正常访问,这个又怎么解?

3

你的是多核机器啊,单进程 CPU 超过 100% 有啥奇怪的,说明应用负载比较高,但是还没到机器 CPU 的极限呗

2

排查进程为啥 CPU 高的方法上面已经写了,alinode 使用问题可以加钉钉群 11794270 私聊,没有其它问题这个 issue 先关闭了?

1

你是在alinode看的cpu占用的对吧 数据库在本台服务器上没 如果在 不一定是egg的原因 可能是数据库索引不对把cpu资源耗尽了