使用 Libuv 线程池提高 Node JS 性能
在 YouTube 上观看视频
Node JS 运行时环境
Libuv 线程池
物理 CPU 核心与逻辑 CPU 核心
如何提高 Node.js 性能
如何检查逻辑核心
结束语
在我的“ Node JS 性能优化”系列文章的第五部分中,我将向您展示如何通过线程池管理来提升Node JS 的性能。我们将通过理解Libuv 的工作原理、线程池的工作原理以及如何根据你的机器规格配置线程数来实现这一点。
您是一位 Node 开发者,但还不熟悉 Node JS 的内部工作原理吗?如果是这样,您可能正在使用一些自安装 Node 以来就存在的默认配置来部署生产应用程序。在本文中,我将介绍一个鲜为人知的配置,它很可能会使某些应用程序的操作性能翻倍。这取决于许多因素,但很有可能对许多人来说都是有益的。
在 YouTube 上观看视频
Node JS 运行时环境
Node 运行时环境由几个活动部件组成。我们应该都熟悉Google V8 引擎,它负责执行JavaScript逻辑。然而,还有一个鲜为人知的库,名为Libuv,它负责管理异步 I/O 操作。
这些 I/O 操作也被称为与操作系统相关的“重度任务”。诸如文件和文件夹管理、TCP/UDP 事务、压缩、加密等任务都通过 Libuv 处理。
虽然大多数操作在设计上都是异步的,但也有一些是同步的,如果处理不当,可能会导致应用程序阻塞。正因如此,Libuv 才有了所谓的“线程池”。
Libuv 线程池
Libuv 会启动一个由 4 个线程组成的线程池,用于卸载同步操作。这样一来,Libuv 就能确保我们的应用程序不会被同步任务不必要地阻塞。
在这里,我们将利用一个设置来更好地适应我们的机器或将要部署应用的虚拟机的规格。这是因为我们可以将默认值 4 个线程更改为最多 1024 个线程。我们通过设置节点变量UV_THREADPOOL_SIZE来实现这一点。
物理 CPU 核心与逻辑 CPU 核心
为了更好地理解 UV_THREADPOOL_SIZE 的设置,我们首先需要了解我们的机器运行了多少个逻辑核心。以我的 MacBook Pro 为例,它运行了 6 个物理 CPU 核心(英特尔)。
然而,这些核心都具备超线程技术,这意味着每个核心可以同时运行两个运算。因此,我们将一个具有超线程的物理核心视为两个逻辑核心。就我而言,我的 MacBook Pro 运行着 12 个逻辑核心。
如何提高 Node.js 性能
建议将UV_THREADPOOL_SIZE设置为机器正在运行的逻辑核心数。在本例中,我将线程池大小设置为 12。
将大小设置为超过硬件正在运行的逻辑核心的任何值都是没有意义的,实际上可能会导致性能下降。
如何检查逻辑核心
在部署过程中,您最不想做的事情就是手动设置UV_THREADPOOL_SIZE,因为您的应用可能在具有不同机器规格的多个环境中运行。因此,我们需要一种方法,在应用在相关环境中启动时动态设置线程池大小。
好消息是,这很简单,但必须谨慎处理。为此,请将以下代码添加到 Node 应用程序的根 JS 文件的顶部:
const OS = require('os')
process.env.UV_THREADPOOL_SIZE = OS.cpus().length
OS模块是 Node.js 原生的。它有一个cpus()函数,可以返回机器当前运行的逻辑核心总数。更棒的是,如果你的 CPU 核心没有超线程,这个函数只会返回物理 CPU 核心的数量,这非常完美。
结束语
我相信这篇文章很有价值。我建议你观看嵌入的视频,并查看我在 GitHub 上的源代码仓库,里面有本文提到的所有内容的代码示例。
下次再见,干杯😎
文章来源:https://dev.to/bleedingcode/increase-node-js-performance-with-libuv-thread-pool-5h10