长时间运行的THREE.js应用程序中的GPU崩溃与干净的JavaScript堆配置文件

时间:2018-04-25 17:48:03

标签: javascript google-chrome three.js webgl

我们长期运行的THREE.js应用程序(24/7)在使用几天后崩溃。我已将模拟用户交互的压力测试放在一起,这些测试位于while(true)循环中,这些似乎需要3-4天才会发生WebGL_Context_Lost事件,这通常表示GPU进程崩溃。

我精通Chrome Dev Tools Heap剖析器并运行了大量测试,所有测试都返回,每次模拟之间没有任何对象(上述相同的模拟)。

这是截图之一,仅显示留下的系统对象(忽略第一个快照的大小): enter image description here

JavaScript内存和GPU内存都在Chrome任务管理器中攀升,但稳定了(我觉得GC因为这些操作的频繁程度而被推迟)。没有连续爬向碰撞,表明泄漏。

版本:Chrome 65-66,Windows 10,THREE.js r91

问题:

  1. JavaScript堆是否有可能无泄漏,但GPU中有漏洞?

  2. 我可以使用哪些工具来查找GPU内存泄漏?

  3. 是否可以知道WebGL_context_lost的确切原因? (Chrome日志?)

  4. 以前有人处理过此事吗?

  5. 有什么想法吗?

  6. 提前致谢

    更新

    模拟运行30分钟,我捕获堆快照,然后是Chrome任务管理器的截图(AFAIK Capturing Heap Snapshots也运行GC)。

    5:00 - 主屏幕的初始快照

    enter image description here

    5:30

    enter image description here

    6:00

    enter image description here

    6:30

    enter image description here

    7ish

    enter image description here

    8PM

    enter image description here

    这是令人困惑的部分:即使在执行手动GC之后,GPU内存仍然保持在~490MB,直到我切换标签然后它又回到了初始状态

    enter image description here

    如果切换选项卡将GPU内存恢复到初始状态,那么问题可能是Chrome试图过于聪明并且没有丢弃GPU对象,这会给机器带来压力并最终耗尽内存?

    注意:这些测试是在最新驱动程序(23.20.16.4973 - 2018-02-28)上使用Intel Iris Graphics 540的Intel i5上运行的。

    我们也在运行最新驱动程序的Iris 640上看到了这一点。

    对于那些感兴趣的人,这里是7:30和5:30的堆快照比较:

    enter image description here

    更新2 - 看起来像是司机问题

    重新加载页面后,2分钟进入模拟,GPU崩溃了“老鼠,WebGL遇到了障碍”。记忆没有机会出现,所以我怀疑是否存在泄漏。

    Windows系统日志警告图形驱动程序停止工作,这发生在同一时间。

    GPU crash and corresponding Windows logs

    Chrome中的WebGL上下文丢失错误的时间戳:10:07:52.938PM

    Windows系统日志驱动程序问题的时间戳(我猜它是四舍五入的):10:07:53PM

    1。说这是驱动程序问题是否安全?

    2。 Chrome是否会杀死GPU进程并在进程日志中记录到Windows日志,或者驱动程序是否行为异常导致Chrome导致GPU进程终止?

    本机通过Windows Update运行最新的驱动程序,我将使用英特尔的驱动程序卸载和更新并重新运行测试。

1 个答案:

答案 0 :(得分:2)

我有一个类似的问题: 一个基于Three.js的应用程序,每隔几秒钟从服务器加载一些数据,并显示动画。我应该跑几天。

我确保已处置完所有我不使用的网格物体和材料-GPU进程内存一直在增长,直到应用程序崩溃为止。

我自带的解决方案是创建一个HTML容器页面,其中包含两个iframe元素,一个在另一个之上。然后,主应用程序会加载到顶部iframe,然后每N分钟将同一个应用程序加载到另一个iframe上,然后它们会切换(切换可见性)

先前的iframe.src设置为""。 我保持GPU内存清洁,并且由于主应用程序是无状态的,因此实际上没有什么可察觉的。

希望有帮助。