16

Ben Noordhius 在 Node v0.10.0 中所做的更改之一是在 Unix 中“尊重 UV_THREADPOOL_SIZE 环境变量”。“threadpool.c”源文件似乎就是这样做的。

如果我不设置这个 env 变量,我可以验证我被限制为 4 个线程的线程池,这是线程池的默认大小。

但是我在我的 Linux 服务器上将此环境变量设置为 64,然后重新启动 Node,但我似乎仍然受到限制,似乎是大小为 5 的线程池?!

这对任何人都有意义吗?谢谢!

4

4 回答 4

14

看来您必须使用 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
于 2013-12-13T06:13:27.460 回答
5

如果您运行的是 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

于 2018-04-25T05:41:50.147 回答
0

确保您永远不会将 UV_THREADPOOL_SIZE 设置为大于您拥有的核心处理器数量的数字,因为这会增加上下文切换,从而影响您的应用程序的性能。

const OS = require('os');
process.env.UV_THREADPOOL_SIZE = OS.cpus().length;
于 2021-07-29T21:06:43.623 回答
0

上述说法是不正确的。libuv如果底层操作系统服务执行它自己的非阻塞策略,则不使用。如果底层 OS 服务阻塞,节点实现通常会将操作包装为async使用线程并继续在主线程上执行其他 JS 代码。

上下文切换不会发生,因为更多或更少的线程可用。拥有更多线程的唯一副作用是分配了一些内存。

可以加载的本机库,通常也使用libuv. libuv例如,Oracle 节点驱动程序手册中有一章。其中特别指出,Oracle 驱动程序在libuv线程中与数据库执行交换 - 因此要打开多个与数据库的连接并进行工作,强烈建议使用 upprocess.env.UV_THREADPOOL_SIZE

另请注意下面这行代码,完全错误,必须在节点启动前设置,从节点内部设置无效。

process.env.UV_THREADPOOL_SIZE = OS.cpus().length;
于 2022-01-14T19:52:44.247 回答