Table of Contents

1. 前言

本文是系列文章Node.JS Profile的一部分,完整的文章列表请去总章查看。

本文主要负责介绍Node的EventLoop简单介绍,及指导如何获取EventLoop的lag数据。

2. EventLoop

关于什么是EventLoop,里面的知识点有哪些等细节的分析和介绍在这里就不进行了。有几篇不错的文章,直接看即可:

  • Node.js 事件循环一: 浅析
    • 非常好的一篇事件循环解释文,当中用了很详细的代码例子来帮助理解,建议深入阅读
  • 关于 macrotask 和 microtask
    • 上一篇文章的补充,对macroTaskmicroTask进行了非常详细的解释
  • Node 定时器详解
    • 阮一峰老师针对Node里定时器的分类及时序的一篇文章,对于时间顺序有疑问的可以仔细阅读,虽然名字叫定时器详解,但里面也包含了很多事件循环的细节

一般来说,如果仅只是简单实现业务逻辑的话,是不需要非常深入了解多个定时器和多个队列之间的关系和执行先后顺序的。但,如果是编写某些先后顺序很敏感的业务程序话,则需要仔细吃透这块才不容易出问题。

3. EventLoop Lag

上面关于EventLoop的知识点能完全掌握是最好,但如果不能的话,也不是什么大问题。对于我们当前的主题Node Profile来说,最关键的是要了解当前应用程序执行过程中EventLoop的lag状况。

在理解了Node的单线程模型之后,就会明白在EventLoop中产生长时间的delay会对整个Node进程造成什么样的影响,因此EventLoop的lag指标是Profile中必采集的一项指标。对该数值的监控最好取30-40ms这样的值作为边界,其实最好是个位数的ms才最健康,当然这都看应用程序本身了,没有一个绝对标准。

关于应用程序的响应状况和EventLoop lag之间的关系,有一篇文章有举例描述,可以阅读下:Node.js Performance Monitoring - Part 3: Debugging the Event Loop。因为很简单,我这里就不翻译了,直接阅读即可。

4. Lag Monitor

Lag获取相关的工具库没有一款非常权威的工具库占有绝对的领导地位,这个点的功能确实也非常简单,就百来行代码就搞定了,因此也可以理解。这里选择的工具是:pebble/event-loop-lag。从源码上来看,作者非常认真仔细,写了不少注释。源码只有一个文件,阅读很快:event-loop-lag.js

使用上非常简单,这里可以看一个例子:

5. 资料

EOF