Node.jsEventLoop处理的主要循环如下图所示:Timer:通过setTimeout()或setInterval()安排的一切都会在这里处理。IO回调:大多数回调将在这里处理。由于基本上Node.js中的所有用户态代码都在回调中(例如,对传入http请求的回调会触发级联回调),这就是用户态代码。IO轮询:轮询下一次运行要处理的新事件。立即设置:运行所有使用setImmediate()注册的回调。close:所有on('close')事件回调都在这里处理。实际上,Node应用程序中发生的所有事情都通过事件循环运行。这意味着,如果我们可以从它们那里获得指标,它们应该会为我们提供有关应用程序整体健康状况和性能的有价值信息。如果应用程序处于空闲状态,这意味着没有待处理的任务(定时器、回调等),全速运行这些阶段是没有意义的,因此事件循环将适应这种情况并等待新的外部事件进入。询问阶段。这也意味着无负载下的指标类似于在高负载(低频率、高持续时间)下与慢速后端通信的应用程序的指标。事件循环延迟事件循环延迟测量在使用setTimeout(X)安排的任务实际得到处理之前需要多长时间。高事件循环延迟表示事件循环正忙于处理回调。Node.js应用程序在单个线程上运行。在多核机器上,这意味着负载不会分布在所有内核上。使用Node附带的集群模块,很容易为每个CPU生成一个子进程。每个子进程维护自己的事件循环,主进程透明地将负载分配给所有子进程。如前所述,libuv将创建一个大小为4的线程池。可以通过设置环境变量UV_THREADPOOL_SIZE来覆盖池的默认大小。虽然这可以解决I/O密集型应用程序的负载问题,但请务必在生产系统上进行此更改之前进行负载测试,因为更大的线程池可能仍会耗尽内存或CPU。
