应用程序没有监控,就如同运行在一个黑盒子里一样,我们既不知道它现在的状况,也难免会担心它在未来某个时刻挂掉。本文将会介绍 Node.js 监控的相关内容。
01
—
监控指标
监控最终一定是落实到一个个具体指标上的,我们需要重点关注哪些指标,这些指标背后又意味着什么呢?
1、CPU Usage
通常情况下,Node.js 消耗的 CPU 资源是很小的,它使用异步非阻塞 IO ,然而 event loop 运行在主线程中,主线程也是可以被阻塞的(比如执行大量 CPU 密集型任务),这会导致 CPU 的使用率及负载过高。(在程序上应该尽量避免 CPU 密集型任务,或者将它们分发到 worker 中去执行)
监控指标:
- CPU Usage
- CPU Load
2、Memory Usage and Leaks
在理解内存的使用和泄漏之前,你需要先了解 heap 和 stack 是什么:stack 用来存储函数及其上下文;heap 则是一个更大的区域,用来存储动态分配的 everything 。单个进程可以拥有的最大 heap 是 1.5 GB ,内存泄漏的问题不容忽视,即使 node.js 所基于的 V8 引擎拥有垃圾回收( Garbage Collection )机制。内存泄漏很容易观察到。
监控指标:
- Released memory between Garbage Collection Cycles
- Process Heap Size
- Process Heap Usage
3、Garbage Collection
Garbage collection 有两种类型:一种是 incremental garbage collection cycles 增量垃圾回收周期一次只处理 heap 中的一部分,快速高效;另一种是 full garbage collection cycles 全量垃圾回收周期,这种方式会暂停程序的执行,因此执行频率很低。
通过测量增量或全量垃圾回收周期的执行频率,我们可以看到它们回收内存所需的时间以及释放的内存大小,将释放的内存与 heap 大小进行比较,观察是否存在增长趋势。
监控指标:
- Time consumed for garbage collection
- Counters for full garbage collection cycles
- Counters for incremental garbage collection cycles
- Released memory after garbage collection
4、Event Loop
Event loop 很特别,它将任务以异步的方式分发到主线程之外去执行,而它本身则需要处理这些事件的响应,也就是异步的回调函数。事件驱动很高效,但是可能会出现 event loop lag(事件驱动滞后),常见的原因是 long-running synchronous processes 和 incremental increase in tasks per loop 。
Long-running synchronous processe : 请注意在应用程序中处理同步执行的方式,毕竟其他操作都需要进行等待。Node.js 著名的规则就是 “Don't block the event loop”,正如上文所述,你可以使用 forks 或者子进程。
Incremental increase in tasks per loop : 事件循环的负载和任务数可能会增加,而 node.js 需要跟踪这些事件循环需要处理的所有异步函数,这可能会导致事件循环的滞后。当然不用过于担心,使用集群模式可以很好的解决这个问题。
监控指标:
- Slowest Event Handling ( Max Latency )
- Fastest Event Handling ( Min Latency )
- Average Event Loop Latency
5、Cluster-Mode and Forking Worker Processes
集群模式和 worker 进程也是现在用的比较多的地方,同样需要进行关注。
监控指标:
- Worker count
- Event loop latency per worker
6、Request/Response Latency
我们的服务最终都是处理请求和响应,监控自然必不可少。
监控指标:
- Response time
- Request rate
- Error rates
- Request/Response content size
02
—
开源监控工具
介绍几个开源的监控工具,开箱即用。
1、Prometheus
普罗米修斯,开源的社区驱动的大名鼎鼎的工具,它可是和 Kubernetes 一样,都是从 Cloud Native Computing Foundation(云原生计算基金会)毕业的项目。这个工具是跨语言的。
2、PM2
https://github.com/Unitech/pm2
大家应该用得挺多。
3、Appmetrics
https://github.com/RuntimeTools/appmetrics-dash
4、Clinic.js
https://github.com/nearform/node-clinic
5、Express Status Monitor