预检清单
- 我已阅读了此项目的 Contributing Guidelines。
- 我同意遵循此项目遵循的 Code of Conduct 。
- 我在 issue tracker 中搜索了一个与我想提交的功能请求相匹配的特征请求,但没有成功。
问题描述
在我的非沙箱渲染器中,我得到了一些性能指标:
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 应该提供这些信息。
其他信息
无
9条答案
按热度按时间zte4gxcn1#
我认为你在寻找
app.getAppMetrics()
该方法允许访问所有进程的进程级指标,而不受沙箱状态(甚至如果JS在它们中运行,例如GPU进程)的影响。
wsxa1bj12#
感谢MarshallOfSound的回复,尽管如此,我仍然不知道如何使用这个API获取与Node相同的CPU信息。它返回一个
CPUUsage
对象,其值是增量,这并不是我想要的。Node返回的值分别衡量了“用户和系统代码所花费的时间”。同样地,我认为
MemoryInfo
对象缺少external
属性(这是Node返回的),或者我不确定它对应什么。4dbbbstv3#
关于允许我们在沙箱渲染器中使用Node的进程资源收集API(上面提到的),你有什么想法?为什么不允许这样做?
s5a0g9ez4#
@MarshallOfSound 这个问题能否重新打开,或者我能得到对上面问题的回复吗?你给出的解决方案没有解决我的问题。谢谢。这阻止我在我的应用中启用沙箱。
deikduxw5#
@pushkin -看起来Node的APIs也返回自上次调用以来的CPU使用率变化。你能明确一下你对这个信息的要求吗?
MemoryInfo
结构包含了所有内存,而不仅仅是JS堆内存,所以external
属性并不相关。app.getAppMetrics
包含了不运行JS的进程的内存详细信息,例如实用程序进程和GPU进程。5ssjco0h6#
你的意思是
external
已经嵌入到(await process.getProcessMemoryInfo()).residentSet
中了吗?我目前不需要其他进程的信息,所以没有真正使用
app.getAppMetrics()
的需求。在工作流程中,我多次调用这些性能指标API,并希望快速获取这些信息。旧方法需要0.035毫秒。使用await getProcessMemoryInfo
需要5.9毫秒,这可能已经不可接受(这就是为什么我希望有同步选项的原因,尽管我认为如果可能的话,它会被实现成这样)。这也是为什么我无法从外部.NET进程获取信息,因为序列化和发送它的成本太高了。tjrkku2a7#
@nornagon 我遇到了 this PR,它允许非沙盒渲染器的节点。这让我担心,因为我的渲染器绝对不能启用Node,所以我将被迫为渲染器启用沙盒。
当然,我想这样做,但这个问题阻止了我将其打开。目前对我的应用程序来说,收集CPU信息(如果可能的话,收集内存信息)对客户非常重要,我们在应用程序的整个生命周期中多次查询这些信息(因此我们需要一个像Node的
process.cpuUsage()
那样快速的解决方案)。我明白你们都很忙于其他事情,但你们是否能至少告诉我Electron是否愿意在他们的进程对象中添加这样的API?
我以前从未做过Electron开发,但如果我的公司批准了,我可以在你们认为对我可行的情况下考虑提交PR。(我当然更希望Electron拥有它,但如果真的需要......)
谢谢!
cnjp1d6j8#
@pushkin - 这似乎与此问题无关?特别是,节点已经在所有未沙盒化的渲染器中启用。
nodeIntegration: false
只从主世界隐藏了一些全局变量 - Node.js仍然存在于后台(& 在预加载脚本中可用)。如果它们直接暴露了对现有Chromium API的访问,我可能会对添加一些新的API持开放态度。我会反对添加直接调用操作系统的新低级代码。如果你需要执行后者,我建议你构建一个本地的Node.js插件。
toe950279#
我建议构建一个本地节点插件
我认为沙盒预加载不能根据这个要求随机的node模块,我是不是误解了“本地节点插件”是什么?@nornagon