【发布时间】:2018-03-26 23:43:44
【问题描述】:
据我所知,所有的IO请求和其他异步任务都是由libuv中的nodejs完成的。
我想知道libuv 是否正在使用线程。如果是,它是否使用了所有可用的核心?
【问题讨论】:
-
是的,libuv 有一个线程池。
-
多核系统是否使用全核?
标签: node.js multithreading core libuv
据我所知,所有的IO请求和其他异步任务都是由libuv中的nodejs完成的。
我想知道libuv 是否正在使用线程。如果是,它是否使用了所有可用的核心?
【问题讨论】:
标签: node.js multithreading core libuv
libuv 模块的职责与标准库中的某些特定功能相关。对于一些标准库函数调用,节点 C++ 端和 libuv 决定完全在事件循环之外进行昂贵的计算。他们制作了称为线程池的东西,线程池是一系列四个线程,可用于运行计算密集型任务比如散列函数。
libuv 默认在这个线程池中创建四个线程。这意味着除了用于事件循环的线程之外,还有四个其他线程可用于卸载需要在我们的应用程序内部进行的昂贵计算。节点标准库中包含的许多函数都会自动使用这个线程池。
如果你有太多的函数调用,它将使用所有的核心。 CPU 内核实际上并没有加快处理函数调用的速度,它们只是在您正在执行的工作中允许一定数量的并发。
【讨论】:
首先,libuv 是什么。正如documentation 中提到的,它是一个专注于异步 I/O 的多平台支持库。
libuv 不将线程用于异步任务,而是用于那些本质上不是异步的任务。
例如,它不使用线程处理套接字,而是使用线程使同步 fs 调用异步。
当涉及线程时,libuv uses a thread pool 的大小可以在编译时使用 UV_THREADPOOL_SIZE 更改。node.js 提供了 libuv 的预编译版本,因此固定UV_THREADPOOL_SIZE参数。
不用说,这与你的芯片的核心数无关。
我很想确认您可以放心地忽略该主题,因为libuv 因此node.js 不要为了它们的目的而密集使用线程(除非您以非常不正当的方式使用它们,或者如果您是运行大量 libuv 工作请求)。
如果您像大多数用户一样需要,请随意为每个内核运行一个 node.js 实例。
libuv 的design overview section 也很清楚这一点:
I/O(或事件)循环是 libuv 的核心部分。它为所有 I/O 操作建立内容,并且它被绑定到单个线程。只要每个事件循环在不同的线程中运行,就可以运行多个事件循环。
【讨论】:
来自here:
Node.js 的单个实例在单个线程中运行。采取 用户有时想要启动的多核系统的优势 一组 Node.js 进程来处理负载。
集群模块允许轻松创建所有子进程 共享服务器端口。
在某些情况下,多进程可能比多线程更好。有些人甚至认为头饰是邪恶的。也许 node.js 的设计方式是比线程更好地利用进程。
【讨论】: