Nodejs 性能贴士

Nodejs 性能贴士。

nodejs 默认使用多少个线程

在典型的 Node.js 进程中,以下是所用线程的细分:

  • 主线程:这是运行 Node.js 事件循环并执行 JavaScript 代码的单一线程。

  • Libuv 线程池:默认情况下,libuv 会创建一个包含 4 个线程的线程池。这些线程用于处理异步 I/O 操作,例如文件系统任务和 DNS 查找。

  • V8 引擎线程:Node.js 使用 V8 JavaScript 引擎,该引擎本身会使用额外的线程。通常,V8 使用 2 个线程来执行垃圾回收和代码优化等任务。

如何增加 libuv 线程池的线程数

要通过 libuv 增加 Node.js 中的线程池大小,可以设置 UV_THREADPOOL_SIZE 环境变量:

UV_THREADPOOL_SIZE=64 node app.js
  • UV_THREADPOOL_SIZE 的最大值可以是 1024,通常建议将其设置为逻辑核心数,以优化 I/O 密集型任务的性能。如果无故将其设置得太高,可能会导致开销增加和潜在的效率低下。

  • 在集群设置中,每个工作进程都有自己的线程池,线程池的总线程数为 UV_THREADPOOL_SIZE * numberOfWorkers

  • 对于 CPU 密集型任务,增加 UV_THREADPOOL_SIZE 可能不会带来显著的好处,并且可能导致资源竞争。建议使用 clusterworker_threads 模块。

如何调整或提高内存性能

利用 --expose-gc 选项

  • Node.js 中的 --expose-gc 标志用于公开垃圾回收 (GC) 功能,实现手动触发垃圾回收。
node --expose-gc app.js

# 在代码中调用 global.gc() 以触发垃圾回收
  • 手动触发垃圾回收可能暂停应用程序的执行,因为所有其他操作在 GC 期间都会停止。如果过度使用,可能会影响性能。应谨慎使用,并且仅在特定情况下使用。

调整 --max-old-space-size

  • Node.js 中的 --max-old-space-size 标志用于设置 V8 引擎旧代堆的最大内存大小,旧代堆是存储长寿命对象的地方。

  • --max-old-space-size 的值应基于可用的系统内存和应用程序的特定需求。例如,如果服务器有 8 GB 的 RAM,则可将它设置为 6 GB,为其他进程留出空间以避免内存交换。

node --max-old-space-size=6144 app.js

# 也可以使用环境变量进行设置,例如:
export NODE_OPTIONS="--max-old-space-size=6144"

nodejs