我们长期运行的THREE.js应用程序(24/7)在使用几天后崩溃。我已将模拟用户交互的压力测试放在一起,这些测试位于while(true)
循环中,这些似乎需要3-4天才会发生WebGL_Context_Lost
事件,这通常表示GPU进程崩溃。
我精通Chrome Dev Tools Heap剖析器并运行了大量测试,所有测试都返回,每次模拟之间没有任何对象(上述相同的模拟)。
这是截图之一,仅显示留下的系统对象(忽略第一个快照的大小):
JavaScript内存和GPU内存都在Chrome任务管理器中攀升,但稳定了(我觉得GC因为这些操作的频繁程度而被推迟)。没有连续爬向碰撞,表明泄漏。
版本:Chrome 65-66,Windows 10,THREE.js r91
问题:
JavaScript堆是否有可能无泄漏,但GPU中有漏洞?
我可以使用哪些工具来查找GPU内存泄漏?
是否可以知道WebGL_context_lost的确切原因? (Chrome日志?)
以前有人处理过此事吗?
有什么想法吗?
提前致谢
更新
模拟运行30分钟,我捕获堆快照,然后是Chrome任务管理器的截图(AFAIK Capturing Heap Snapshots也运行GC)。
5:00 - 主屏幕的初始快照
5:30
6:00
6:30
7ish
8PM
这是令人困惑的部分:即使在执行手动GC之后,GPU内存仍然保持在~490MB,直到我切换标签然后它又回到了初始状态
如果切换选项卡将GPU内存恢复到初始状态,那么问题可能是Chrome试图过于聪明并且没有丢弃GPU对象,这会给机器带来压力并最终耗尽内存?
注意:这些测试是在最新驱动程序(23.20.16.4973 - 2018-02-28)上使用Intel Iris Graphics 540的Intel i5上运行的。
我们也在运行最新驱动程序的Iris 640上看到了这一点。
对于那些感兴趣的人,这里是7:30和5:30的堆快照比较:
更新2 - 看起来像是司机问题
重新加载页面后,2分钟进入模拟,GPU崩溃了“老鼠,WebGL遇到了障碍”。记忆没有机会出现,所以我怀疑是否存在泄漏。
Windows系统日志警告图形驱动程序停止工作,这发生在同一时间。
Chrome中的WebGL上下文丢失错误的时间戳:10:07:52.938PM
Windows系统日志驱动程序问题的时间戳(我猜它是四舍五入的):10:07:53PM
1。说这是驱动程序问题是否安全?
2。 Chrome是否会杀死GPU进程并在进程日志中记录到Windows日志,或者驱动程序是否行为异常导致Chrome导致GPU进程终止?
本机通过Windows Update运行最新的驱动程序,我将使用英特尔的驱动程序卸载和更新并重新运行测试。
答案 0 :(得分:2)
我有一个类似的问题: 一个基于Three.js的应用程序,每隔几秒钟从服务器加载一些数据,并显示动画。我应该跑几天。
我确保已处置完所有我不使用的网格物体和材料-GPU进程内存一直在增长,直到应用程序崩溃为止。
我自带的解决方案是创建一个HTML容器页面,其中包含两个iframe
元素,一个在另一个之上。然后,主应用程序会加载到顶部iframe,然后每N分钟将同一个应用程序加载到另一个iframe
上,然后它们会切换(切换可见性)
先前的iframe.src
设置为""
。
我保持GPU内存清洁,并且由于主应用程序是无状态的,因此实际上没有什么可察觉的。
希望有帮助。