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

问题描述 投票:0回答:5

Ben Noordhius 在 Node v0.10.0 中所做的更改之一是在 Unix 中“尊重

UV_THREADPOOL_SIZE
环境变量”。
threadpool.c
源文件似乎就是这样做的。

如果我不设置此环境变量,我可以验证我的线程池仅限于 4 个线程,这是线程池的默认大小。

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

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

node.js
5个回答
20
投票

看来您必须使用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

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


2
投票

在Windows操作系统中,您需要在命令行中通过节点调用脚本之前设置UV_THREADPOOL_SIZE。

例如

$env:UV_THREADPOOL_SIZE = 5; node script.js


1
投票

以上说法不正确。如果底层操作系统服务执行它自己的非阻塞策略,则不使用

libuv
。如果底层操作系统服务阻塞,节点实现通常会将操作包装为
async
,使用线程并继续在主线程上执行其他 JS 代码。

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

可加载的本机库通常也会使用

libuv
。例如,Oracle 节点驱动程序手册中有一个关于
libuv
的章节。此处特别指出,Oracle 驱动程序在
libuv
线程中与数据库执行交换 - 因此,要打开与数据库的多个连接并执行工作,强烈建议启动
process.env.UV_THREADPOOL_SIZE

另请注意下面这行代码,这是完全错误的,你必须在节点启动之前设置它,从节点内设置它没有效果。

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

0
投票

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

const OS = require('os');
process.env.UV_THREADPOOL_SIZE = OS.cpus().length;
© www.soinside.com 2019 - 2024. All rights reserved.