Node 是否使用 100% CPU?

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

我对我所运行的节点进程所看到的内容有点困惑。主机上的

docker stats
显示容器的 CPU 使用率超过 100%。这让我认为节点进程正在耗尽 CPU。当我在主机上运行
top
并看到节点进程使用超过 100% CPU 时,这一点得到了证实。

当我跳入 docker 容器时,我看到节点仅使用了 54% 的 CPU,并且处理被分配在两个核心之间。由于 Node 是单线程的,我预计会看到一个核心达到最大,而另一个核心达到 0。

我发现了这个 QA,看起来操作系统可以在内核之间移动进程(对我来说是新闻)。 这个单 Node.JS 应用程序使用多核吗?

你能帮我解释一下结果吗?节点是否已达到极限?或者由于容器中的进程显示 54% 使用率,是否可以上升到 100%?为什么节点容器的顶部显示节点的使用率为 54%,但两个核心的使用率为 45% + 46%。除了单节点进程之外,容器中没有任何东西在运行。我没有使用集群,尽管我可能包含一个包。

我问这一切是因为我想了解是否应该扩展此 ECS 实例或者节点是否可以处理更多。

Node.JS: 15.1.0
EC2 Instance: c5.large

enter image description here

node.js docker
1个回答
13
投票

不同
top
s

您所看到的(可能)是由于

top
的口味差异造成的。

我大胆猜测一下,你的 Docker 镜像可能是基于 Alpine 的? Alpine 中的

top
命令是
busybox
。它将每个进程的 CPU 使用率报告为 TOTAL 可用 CPU 数量 (nCPU * 100%) 的百分比。

这与大多数其他风格的

top
不同,后者将每个进程的 CPU 使用率报告为 SINGLE CPU 的百分比。

两个顶部显示相同的内容:每个 CPU 的使用率约为 50%

这两个

top
屏幕截图实际上显示了同一件事:
node
进程使用了 2 个 CPU 中每个 CPU 的大约 50%。

测试理论

我们可以通过以下方式进行测试:

# This will max out 1 cpu of the system
docker run --name stress --rm -d alpine sh -c 'apk add stress-ng && stress-ng --cpu 1'

# This shows the busybox top with usage as ratio of total CPUs
# press 'c' in top to see the per-CPU info at the top
docker exec -it stress top

# This will install and run procps top, with usage as a ratio of single CPU
docker exec -it stress sh -c 'apk add procps && /usr/bin/top'

screenshot of cpu usage in two different cpu usage monitors

在上面的截图中,我们可以看到两种不同口味的

top
。它们报告相同的 CPU 使用率,但上一个报告为“100% CPU”(占单个核心的百分比),而下一个报告为 6%(1/16 核心 = 6.25%)。

这告诉我们关于
node
的 CPU 使用率的什么信息?

Node 是单线程的,不能使用超过 100% 的 CPU。 ...有点。在底层,Node 使用

libuv
,它确实在孤岛中运行线程。例如,这就是 Node 接收 IO 操作的异步事件的方式。这些线程do使用CPU,并且可以使CPU使用率超过100%。有些包也被编写为 Node 的附加组件,并且它们也使用线程。

环境变量

UV_THREADPOOL_SIZE
限制了可以同时运行的libuv控制线程的最大数量。在运行节点之前将其设置为更大的数字(默认为 4)可能会消除瓶颈。

如果您正在进行一些 CPU 密集型操作,请考虑使用

cluster
工作线程编写自己的附加组件或生成单独的进程来进行计算。

© www.soinside.com 2019 - 2024. All rights reserved.