NodeJS 有没有人尝试过使用UV_THREADPOOL_SIZE环境变量?

h22fl7wq  于 2023-05-28  发布在  Node.js
关注(0)|答案(5)|浏览(248)

Ben Noordhius在Node v0.10.0中所做的更改之一是在Unix中“荣誉UV_THREADPOOL_SIZE环境变量”。“threadpool.c”源文件似乎就是这样做的。
如果我不设置这个env变量,我可以验证我被限制为4个线程的线程池,这是线程池的默认大小。
但是我在Linux服务器上将这个环境变量设置为64,然后重新启动Node,但我似乎仍然受到限制,似乎线程池的大小为5?!
这对任何人都有意义吗?谢谢!

j8ag8udp

j8ag8udp1#

看起来你必须用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
aamkag61

aamkag612#

如果您运行的是Windows操作系统并通过.js文件运行,则需要在通过node调用脚本之前设置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

o0lyfsai

o0lyfsai3#

在Windows操作系统中,您需要在通过命令行中的节点调用脚本之前设置UV_THREADPOOL_SIZE。
例如$env:UV_THREADPOOL_SIZE = 5; node script.js

l3zydbqr

l3zydbqr4#

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

const OS = require('os');
process.env.UV_THREADPOOL_SIZE = OS.cpus().length;
a6b3iqyw

a6b3iqyw5#

上述说法不正确。如果底层OS服务执行自己的非阻塞策略,则不使用libuv。如果底层OS服务阻塞,节点实现通常会使用线程将操作 Package 为async,并继续在主线程上执行其他JS代码。
上下文切换不会发生,因为有更多或更少的线程可用。拥有更多线程的唯一副作用是分配了一些RAM。
可以加载的本地库通常也使用libuv。例如,Oracle节点驱动程序手册中有一章是关于libuv的。这里要特别注意的是,Oracle驱动程序在libuv线程中执行与DB的交换-因此,要打开多个到DB的连接并进行工作,强烈建议使用process.env.UV_THREADPOOL_SIZE
也请注意下面的代码行,它是完全错误的,你必须在节点启动之前设置它,在节点内设置它没有效果。

process.env.UV_THREADPOOL_SIZE = OS.cpus().length;

相关问题