Ben Noordhius 在 Node v0.10.0 中所做的更改之一是在 Unix 中“尊重
UV_THREADPOOL_SIZE
环境变量”。 threadpool.c
源文件似乎就是这样做的。
如果我不设置此环境变量,我可以验证我的线程池仅限于 4 个线程,这是线程池的默认大小。
但是我在 Linux 服务器上将这个环境变量设置为 64,然后重新启动 Node,但我似乎仍然受到限制,似乎是大小为 5 的线程池?!
这对任何人都有意义吗?谢谢!
看来您必须使用node命令或从node程序内部将其设置为var。执行如下:
UV_THREADPOOL_SIZE=64 node
或从程序修改:
process.env.UV_THREADPOOL_SIZE=64
//then execute some function that requires threadpool
require('fs').readFile('testing',function(){});
测试线程:
ps -Lef | grep "\<node\>" | wc -l
67
如果您运行的是 Windows 操作系统并通过 .js 文件运行,则需要在通过节点调用脚本之前设置
UV_THREADPOOL_SIZE
。
cmd 中的示例:
SET UV_THREADPOOL_SIZE=2 && node my-file-to-run.js
(=
周围没有空格)
或者在 Powershell 中:
$env:UV_THREADPOOL_SIZE = 2 && node my-file-to-run.js
在Windows操作系统中,您需要在命令行中通过节点调用脚本之前设置UV_THREADPOOL_SIZE。
例如
$env:UV_THREADPOOL_SIZE = 5; node script.js
以上说法不正确。如果底层操作系统服务执行它自己的非阻塞策略,则不使用
libuv
。如果底层操作系统服务阻塞,节点实现通常会将操作包装为 async
,使用线程并继续在主线程上执行其他 JS 代码。
不会发生上下文切换,因为可用线程或多或少。拥有更多线程的唯一副作用是分配了一些内存。
可加载的本机库通常也会使用
libuv
。例如,Oracle 节点驱动程序手册中有一个关于 libuv
的章节。此处特别指出,Oracle 驱动程序在 libuv
线程中与数据库执行交换 - 因此,要打开与数据库的多个连接并执行工作,强烈建议启动 process.env.UV_THREADPOOL_SIZE
另请注意下面这行代码,这是完全错误的,你必须在节点启动之前设置它,从节点内设置它没有效果。
process.env.UV_THREADPOOL_SIZE = OS.cpus().length;
确保永远不要将 UV_THREADPOOL_SIZE 设置为大于您拥有的核心处理器数量的数字,因为这会增加上下文切换,从而影响应用程序的性能。
const OS = require('os');
process.env.UV_THREADPOOL_SIZE = OS.cpus().length;