Lorawan-stack: 数据视图在收到许多事件后变慢并冻结

创建于 2020-07-13  ·  12评论  ·  资料来源: TheThingsNetwork/lorawan-stack

概括

控制台的数据视图在收到大量事件后冻结。

重现步骤

  1. 转到接收大量事件的实体的数据视图
  2. 观察传入事件时等待一段时间(等待时间与事件频率有关)
  3. 观察应用程序变慢
  4. 观察应用程序最终完全冻结

你现在看到了什么?

冻结数据视图

你想看什么?

无论收到的事件数量如何,数据视图都是稳定的

环境

v3.5.8 及更早版本

您建议如何实施?

当控制台订阅事件源时,该问题可能是由于 redux 存储被大量填充造成的。 特别是由于数据包代理更新,它会在每个事件中接收大量数据,这很容易占用内存。 我解决这个问题的想法是:

  • 引入存储的最大消息量(其余被截断)
  • 丢弃旧事件的事件数据
  • 尝试将事件数据存储在浏览器localStorage而不是 redux 存储中。 然后我们只能引用 redux 存储中的事件数据。 这是基于假设的购买,也许localStorage可以更好地处理大量数据。

@bafonins你怎么看?

你打算如何测试这个?

手动测试。

你能自己做这个并提交一个拉取请求吗?

是的。

bug console discuss performance uweb

所有12条评论

当控制台订阅事件源时,该问题可能是由于 redux 存储被大量填充造成的。 特别是由于数据包代理更新,它会在每个事件中接收大量数据,这很容易占用内存。

Redux store 在这里肯定是相关的,但主要的问题是渲染。 在https://github.com/TheThingsNetwork/lorawan-stack/pull/2477#discussion_r421182736之后,我删除了在事件视图中呈现的事件数量限制。

您的解决方案看起来不错,但确实localStorage需要一些实验

因此,经过一段时间的研究后,我认为这里的解决方案是三重的:

  1. 重构整体事件组件结构,目前嵌套的方式使得维护和优化性能非常困难(我们使用元素克隆和渲染道具,这使得无法使用列表元素的记忆化)
  2. 使用像react-window这样的虚拟化模块来只渲染当前可见的列表元素
  3. 研究其他存储事件数据的方法,如 OP 中所述(我将在引入 1. 和 2. 之后对性能进行试验。因为正如@bafonins 所提到的,性能问题主要与渲染相关)
  1. 您可以将记忆添加到渲染函数~顶级事件组件~。
  2. 这行不通。 在实现事件组件的第一个版本时,我尝试使用虚拟化列表。 主要是因为动态高度。

不幸的是,这个问题仍然存在。 虽然,事件视图现在可以处理更多负载,但仍然存在一定的事件计数和频率阈值,这会导致延迟和冻结。

我将重新引入最大数量的事件作为快速补救措施,直到我们可以进一步微调。

这是在进行中吗?

这不再进行了。 我不得不结束两次尝试来改进这一点,因为无法验证这些解决方案是否有帮助。 通过#3229 虚拟化列表后,情况得到了显着改善,但是当事件视图接收到数千个事件时仍然存在故障点。 我不知何故错过了通过限制控制台中显示的事件数量来解决这个问题的 PR。 现在会这样做。

我不知何故错过了通过限制控制台中显示的事件数量来解决这个问题的 PR。 现在会这样做。

-> #3470

此外,这两条评论提供了一些关于我尝试做的事情以及我遇到的问题的见解:

https://github.com/TheThingsNetwork/lorawan-stack/pull/3329#issuecomment -712410891

https://github.com/TheThingsNetwork/lorawan-stack/pull/3330#issuecomment -712937573

希望这将有助于未来更彻底地解决该问题的尝试。

重新打开它,因为在显示具有约 50 多个终端设备的应用程序的事件时问题仍然存在(这取决于终端设备发送或接收数据的频率)。 在这个评论中已经有一些想法可以解决这个问题。

让我们使用此线程来讨论解决此问题的其他可能方法。 另请参阅https://github.com/TheThingsNetwork/lorawan-stack/pull/3329#issuecomment -712410891 和https://github.com/TheThingsNetwork/lorawan-stack/pull/3330#issuecomment -712937573

@kschiffer这里的状态是什么?

这个很棘手。 #3817 阻止了正确解决此问题。 此处描述了中间修复程序https://github.com/TheThingsNetwork/lorawan-stack/issues/2231#issuecomment -779659836。

要添加这一点,我们需要能够过滤事件类型的事件流,这是事件服务器 TheThingsIndustries/lorawan-stack#1804 将添加的内容之一。

因此,无论哪种方式,似乎都没有快速的补救措施。 我唯一能想到的初步修复是自动关闭事件流并在达到事件/秒阈值时显示解释消息。

所以这需要从当前的里程碑中删除,因为它现在不可操作,因为我们需要首先对此做出决定。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

johanstokking picture johanstokking  ·  6评论

htdvisser picture htdvisser  ·  9评论

htdvisser picture htdvisser  ·  4评论

bafonins picture bafonins  ·  5评论

adriansmares picture adriansmares  ·  8评论