前几天 Node.js 12.0.0 发布了,网上也有很多文章介绍这个版本的新的特性,例如 https://www.yuque.com/egg/nodejs/nodejs-12,不过今天我想要介绍的是另外一个小故事。
我们在公司内部使用 Node.js 的时候,遇到了一个困扰我们很久的问题,Node.js 进程的 CPU 使用率经常会达到 100%,很多产品线都会遇到,而且问题复现非常困难,偶尔复现之后,进入到容器用过 strace 来查看系统调用,发现 epoll_ctl 和 epoll_pwait 这两个系统调用占用大部分CPU时间,虽然问题经常出现,但是是偶发性的,所以之前并没有花费太多的精力去追查。然后突然某一天,线上所有的 Node.js 服务在同一时刻,都出现了这个问题,所以解决这个问题刻不容缓。
在 oyyd 和 yeyuanfeng 排查了很久之后,最终由 yeyuanfeng 同学帮忙把这个问题搞定了,整个问题的追查过程非常精彩,但是版权属于 yeyuanfeng 同学,我这里就不放出来了。相关的 Issue 和 Pull Request 大家可以参考:
CPU Usage 100% · Issue #2162 · libuv/libuvgithub.com目前发布的 Node.js 12.0.0 里面已经包含了这次的改动,相关的 Commit 地址是:https://github.com/nodejs/node/commit/0109e121d3a2f87c4bad75ac05436b56c9fd3407
---
PS: 前几天跟 @Rokid 的同学 @Yorkie 交流的时候,这个 Patch 刚好也解决了他们的问题