我对我所运行的节点进程所看到的内容有点困惑。主机上的
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
top
s您所看到的(可能)是由于
top
的口味差异造成的。
我大胆猜测一下,你的 Docker 镜像可能是基于 Alpine 的? Alpine 中的
top
命令是 busybox
。它将每个进程的 CPU 使用率报告为 TOTAL 可用 CPU 数量 (nCPU * 100%) 的百分比。
这与大多数其他风格的
top
不同,后者将每个进程的 CPU 使用率报告为 SINGLE CPU 的百分比。
这两个
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'
在上面的截图中,我们可以看到两种不同口味的
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)可能会消除瓶颈。
cluster
、工作线程、编写自己的附加组件或生成单独的进程来进行计算。