相关疑难解决方法(0)

Node 使用 100% CPU 吗?

我对我在运行的节点进程中看到的内容感到有些困惑。docker stats主机上显示容器正在使用超过 100% 的 CPU。这让我认为节点进程正在最大化 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
NestJS: 7.3.1
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

node.js docker nestjs

12
推荐指数
1
解决办法
1437
查看次数

为什么单个线程进程在多个处理器/内核上执行?

假设我运行一个简单的单线程进程,如下所示:

public class SirCountALot {
    public static void main(String[] args) {
        int count = 0;
        while (true) {
            count++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(这是Java,因为这是我所熟悉的,但我怀疑它并不重要)

我有一个i7处理器(4核,或8计数超线程),我正在运行Windows 7 64位,所以我启动了Sysinternals Process Explorer来查看CPU使用率,正如预期的那样,我看到它使用了大约20%所有可用的CPU.

图表显示所有核心的CPU使用率为20%

但是,当我切换每个CPU显示1个图形的选项时,我看到使用的是4个"核心"中的1个,CPU使用率遍布整个核心:

图表显示每个核心的CPU使用率不稳定,总使用率约为20%

相反,我期望的是1核心最大化,但这只发生在我将流程的亲和力设置为单个核心时.

图表显示最近的CPU使用量大部分仅限于第一个核心

为什么工作负载分散在不同的核心上?不会将工作负载分散到多个核心,因为缓存还是会导致其他性能损失?

这是为了防止一个核心过热的简单原因吗?还是有更深层次的原因?

编辑:我知道操作系统负责调度,但我想知道为什么它"烦恼".当然,从一个天真的角度来看,将(主要是*)单线程进程坚持到1核心是更简单,更有效的方法吗?

*我说主要是单线程,因为这里有多个theads,但只有2个在做任何事情:

显示Eclipse中线程数的屏幕截图 屏幕截图显示Process Explorer流程属性中的线程数

java multithreading operating-system multicore multiprocessing

11
推荐指数
1
解决办法
3615
查看次数

主线程繁忙时是否可以进行垃圾回收?

假设我有一个很长的运行循环:

// Let's say this loop takes 10 seconds to execute
for(let i = 0; i <= 1000000; ++i) {
    const garbage = { i };
    // some other code
}
Run Code Online (Sandbox Code Playgroud)

垃圾收集器可以在循环期间运行,还是只能在应用程序空闲时运行?

我没有找到任何与此相关的文档,但是因为 Node.js 具有--nouse-idle-notification理论上禁用 GC 的功能,所以我认为 GC 仅在发送空闲通知时运行(当主线程不忙时)。

我之所以这么问是因为我的循环有时会在执行时间上出现峰值,并且想知道 GC 是否有可能在循环期间运行,从而导致延迟峰值。

javascript garbage-collection v8 node.js

5
推荐指数
1
解决办法
1670
查看次数