[功能请求]:为Electron的process对象添加额外的API/信息以获取性能指标

brgchamk  于 3个月前  发布在  Electron
关注(0)|答案(9)|浏览(63)

预检清单

问题描述

在我的非沙箱渲染器中,我得到了一些性能指标:

const memoryInfo: NodeJS.MemoryUsage = process.memoryUsage();
const cpuTime = process.cpuUsage().system + process.cpuUsage().user;

现在,由于我正在对渲染器进行沙箱处理,我不得不使用 Electron 的 process 对象而不是 Node 的。
对于 CPU 时间,我可以调用 process.getCPUUsage() ,但我不确定如何确切地获取我在 Node 中看到的 user + system 值。
Node 文档说:
返回当前进程的用户和系统 CPU 时间使用情况
不确定与 getCPUUsage (文档中的 here) 的返回值有什么等效关系。
接下来,我通过执行以下操作来获取堆和 rss 信息(通常由 Node 的 process.memoryUsage() 返回):

heapTotal = process.getHeapStatistics().totalHeapSize * 1024
heapUsed = process.getHeapStatistics().usedHeapSize * 1024
rss = (await process.getProcessMemoryInfo()).residentSet

然而,如何获取 external?在 Node(文档)中,它指的是:
C++ 对象绑定到 JavaScript 对象的管理由 V8 管理的内存使用情况
Node 设置的 arrayBuffers 属性对我个人来说没有用处。

建议的解决方案

是否可以在现有 API 的一个返回值中找到一个 API/附加属性,以获取与 Node 返回的相应值?即:

  • process.cpuUsage()
  • process.memoryUsage().external

此外,理想情况下,如果可能的话, getProcessMemoryInfo 将像 Node 中的那样是同步的(我现在有一个版本偏差问题,我的 Electron 应用程序和它托管的网站之间存在差异,网站假定性能指标 API 是同步的,但现在不再是这样)

考虑过的替代方案

实际上,我不太确定我们能在这里做什么。在我看来,Electron 应该提供这些信息。

其他信息

zte4gxcn

zte4gxcn1#

我认为你在寻找app.getAppMetrics()
该方法允许访问所有进程的进程级指标,而不受沙箱状态(甚至如果JS在它们中运行,例如GPU进程)的影响。

wsxa1bj1

wsxa1bj12#

感谢MarshallOfSound的回复,尽管如此,我仍然不知道如何使用这个API获取与Node相同的CPU信息。它返回一个CPUUsage对象,其值是增量,这并不是我想要的。Node返回的值分别衡量了“用户和系统代码所花费的时间”。
同样地,我认为MemoryInfo对象缺少external属性(这是Node返回的),或者我不确定它对应什么。

4dbbbstv

4dbbbstv3#

关于允许我们在沙箱渲染器中使用Node的进程资源收集API(上面提到的),你有什么想法?为什么不允许这样做?

s5a0g9ez

s5a0g9ez4#

@MarshallOfSound 这个问题能否重新打开,或者我能得到对上面问题的回复吗?你给出的解决方案没有解决我的问题。谢谢。这阻止我在我的应用中启用沙箱。

deikduxw

deikduxw5#

@pushkin -看起来Node的APIs也返回自上次调用以来的CPU使用率变化。你能明确一下你对这个信息的要求吗?
MemoryInfo结构包含了所有内存,而不仅仅是JS堆内存,所以external属性并不相关。app.getAppMetrics包含了不运行JS的进程的内存详细信息,例如实用程序进程和GPU进程。

5ssjco0h

5ssjco0h6#

你的意思是 external 已经嵌入到 (await process.getProcessMemoryInfo()).residentSet 中了吗?
我目前不需要其他进程的信息,所以没有真正使用 app.getAppMetrics() 的需求。在工作流程中,我多次调用这些性能指标API,并希望快速获取这些信息。旧方法需要0.035毫秒。使用 await getProcessMemoryInfo 需要5.9毫秒,这可能已经不可接受(这就是为什么我希望有同步选项的原因,尽管我认为如果可能的话,它会被实现成这样)。这也是为什么我无法从外部.NET进程获取信息,因为序列化和发送它的成本太高了。

tjrkku2a

tjrkku2a7#

@nornagon 我遇到了 this PR,它允许非沙盒渲染器的节点。这让我担心,因为我的渲染器绝对不能启用Node,所以我将被迫为渲染器启用沙盒。
当然,我想这样做,但这个问题阻止了我将其打开。目前对我的应用程序来说,收集CPU信息(如果可能的话,收集内存信息)对客户非常重要,我们在应用程序的整个生命周期中多次查询这些信息(因此我们需要一个像Node的 process.cpuUsage() 那样快速的解决方案)。
我明白你们都很忙于其他事情,但你们是否能至少告诉我Electron是否愿意在他们的进程对象中添加这样的API?
我以前从未做过Electron开发,但如果我的公司批准了,我可以在你们认为对我可行的情况下考虑提交PR。(我当然更希望Electron拥有它,但如果真的需要......)
谢谢!

cnjp1d6j

cnjp1d6j8#

@pushkin - 这似乎与此问题无关?特别是,节点已经在所有未沙盒化的渲染器中启用。nodeIntegration: false 只从主世界隐藏了一些全局变量 - Node.js仍然存在于后台(& 在预加载脚本中可用)。

如果它们直接暴露了对现有Chromium API的访问,我可能会对添加一些新的API持开放态度。我会反对添加直接调用操作系统的新低级代码。如果你需要执行后者,我建议你构建一个本地的Node.js插件。

toe95027

toe950279#

我建议构建一个本地节点插件
我认为沙盒预加载不能根据这个要求随机的node模块,我是不是误解了“本地节点插件”是什么?@nornagon

相关问题