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
可能不会带来显著的好处,并且可能导致资源竞争。建议使用cluster
或worker_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"