【问题标题】:Angular CLI - ng serve - high cpu usage from node processAngular CLI - ng serve - 来自节点进程的高 CPU 使用率
【发布时间】:2020-09-01 02:18:57
【问题描述】:

我正在努力解决一个问题,即在本地运行任何 Angular 应用程序时,链接到 ng serve 的节点进程正在使用超过 100% 的 CPU 内核。

我现在的环境是:

Angular CLI:7.3.10 节点:11.15.0 操作系统:darwin x64 (Mac OS X Catalina 10.15.4) 角度:7.2.16

我遇到过很多关于此的帖子和问题,其中常见的解决方案似乎是针对 Mac OS 问题安装 fsevents

我尝试过的事情:

  • node-gyp 安装 XCode 命令行工具以在安装后重建 fsevents
  • 安装最新版本的fsevents (2.1.3),因为旧版本被指定为 angular-cli (1.2.13) 的可选依赖项
  • 使用不同的节点版本,尝试 12.13.0 并删除 node_modules 并进行全新安装。还尝试了最新的fevents版本
    • 如果相关,我也使用nvm
  • 试过npm rebuild
  • 将我的一个应用程序从 Angular 7 升级到 9,在干净安装依赖项后仍然是相同的行为,确保安装 fsevents 并尝试最新版本

无论我尝试什么,我一直观察到 CPU 使用率很高,我发现它有时会上升 300-400%。

这确实阻碍了我的发展,我希望有人能提出一些我可以尝试的好主意。

如果做不到这一点,我想知道是否应该尝试完全卸载 node,摆脱 nvm 并从头开始。

【问题讨论】:

  • 我没有意识到 poll 是毫秒级的,我在 5 点完成了 - 这也导致我的 CPU 飙升 - 感谢更新
  • 如果您自己找到答案,post it as an answer;不要将其编辑到您的问题中

标签: node.js angular webpack node-gyp fsevents


【解决方案1】:

看来我设法解决了这个问题: 删除 /node_module 并重新安装

在我的情况下,这有帮助 我在这里找到了建议: https://gitmemory.com/issue/angular/angular-cli/14748/501608887

【讨论】:

    【解决方案2】:

    在 Angular 开发环境中;转译/编译会导致 CPU 峰值。如果这种情况发生得太频繁,您的系统就会出现问题。

    有一些方法可以稍微缓解疼痛;

    • 完全关闭文件更改检测/实时重新加载/自动编译

    ng serve --live-reload falseng serve --no-live-reload 等,具体取决于您的 Angular CLI 版本

    • 拥有更好的变更检测,仅在真正需要时做出反应

    npm install fsevents

    npm rebuild fsevents

    npm serve

    • 忘记更改检测,根据时间间隔检查更改

    ng serve --poll [ms]

    CPU 管理很棘手,这个问题可能有很多原因。这些只是与 Angular 开发密切相关的几种可能性。我希望这个答案能为遇到同样问题的人提供一些选择。

    【讨论】:

    • 在 Angular 9 项目中工作:安装 fsevents 可以让节点进程平静下来,否则节点进程会一直以约 60% 的 CPU 运行。现在我很少在活动监视器中看到它。如果使用 Node 14+,您可以安装 fsevents@2。
    • --poll 帮我做了
    • 如果您使用的是 Apple Silicon,当前版本的 fsevents (2.2.1) 无法正常工作。请参阅:github.com/fsevents/fsevents/issues/349 了解解决方法。
    【解决方案3】:

    也许您在Docker 上为您的热/实时重新加载设置了类似的设置,例如ng serve --host 0.0.0.0 --poll 1poll 值有问题,将其更改为更大的值,例如 2000,例如 ng serve --host 0.0.0.0 --poll 2000

    现在,您将失去(几乎)实时热/实时重新加载,但您将节省 CPU/电池,并在您的应用刷新更改的代码之前有 2 秒的延迟。

    【讨论】:

      【解决方案4】:

      经过大量挖掘,我发现以下选项对我很有效。在此之前,我每次遇到 JavaScript 堆内存不足的问题。尝试使用自定义节点内存,但注意对我有用,而不是低于一个。

      ng serve --source-map=false
      

      ng build --source-map=false
      

      像魅力一样工作。

      【讨论】:

        【解决方案5】:

        如果您使用 Yarn 安装软件包,其锁定文件可能已锁定在旧版本的 fsevents 中,该版本在 Apple Silicon 上与 node-pre-gyp 存在已知问题。

        https://github.com/nodejs/node-gyp/issues/2296

        只需删除yarn.lock,然后再次运行yarn,应该会尝试安装不存在该问题的fsevents 依赖项的较新版本。

        这适用于 Angular 11。

        【讨论】:

          猜你喜欢
          • 2019-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-28
          • 2016-11-06
          相关资源
          最近更新 更多