【问题标题】:Current state of Haskell soft real-timeHaskell 软实时的当前状态
【发布时间】:2013-02-20 14:07:02
【问题描述】:

我正在考虑将 Haskell 用于软实时应用程序。我可能会使用演员,因为它的价值。我想知道是否有人对 Haskell 的当前实时状态有所了解。具体来说,GC 暂停应用程序的问题。我在 Google 上进行了广泛的搜索,发现了 2 年前的大量讨论,但没有最新的。以下是我找到的一些参考资料:

Using Haskell for sizable real-time systems: how (if?)?

How about Haskell's GC performance for soft realtime application like games?

我读过的许多旧资料表明,情况(当时)被认为正在改善。有吗?

即使在 2 多年前,也有一些 cmets 建议可以对 Haskell 应用程序进行调整,以可靠地将 GC 暂停时间降至一两毫秒。这看起来很现实吗?

【问题讨论】:

  • 我还没有看到 GC 暂停效果,例如 xmonad 或 frag。分析工具足以确保您不会产生大量垃圾。
  • 我对 Haskell 中的演员有点警惕,GHC 线程的研究要好得多
  • 我认为这个问题很难凭经验回答,但作为数据,我经常在相当标准的商品硬件上的软实时应用程序中看到亚毫秒级 gc 暂停。

标签: haskell garbage-collection real-time


【解决方案1】:

GHC 8.2.1 有一个名为 Compact Regions 的功能可能会有所帮助。

据我了解,这似乎是一种半手动的内存管理。 您可以将长期存在的数据存储在 Compact Region 中,而垃圾收集器不会对其进行跟踪。如果对 Compact Region 中的任何内容有任何引用,则整个 Compact Region 都会保持活动状态。一旦没有对该区域中任何内容的引用,它将被释放。如果您对区域的内容进行功能更新,您可以在新区域中重新分配它,旧区域将被释放。

http://ezyang.com/compact.html
https://hackage.haskell.org/package/compact-0.1.0.1/docs/Data-Compact.html

【讨论】:

    【解决方案2】:

    因此,“实时”问题在于 GC 收集引入的延迟。

    GHC 使用多核垃圾收集器(有a branchper-thread local heaps)。最初开发是为了通过降低频繁停止世界同步的成本来提高多核性能(每个核心can collect independently),出于同样的原因,这恰好也有利于软实时。然而,截至 2013 年,per-thread local heap 尚未合并到 main GHC 中,尽管并行 GC 已经合并。

    对于游戏,您应该能够通过使用线程来利用这一点,从而减少对 stop-the-world 本地集合的需求。

    对于长期存在的对象,在全局堆中,您仍然会冒一些 (ms) GC 的风险。但是,仔细分析例如ThreadScope 将消除这里的障碍。我已经看到通过 GHC 管理的网络堆栈流式传输实时 1080p 视频,而没有明显的 GC 暂停。

    即使没有这些调整,事情也“可能会奏效”。 Frag 几乎不需要优化,并且在将近 10 年前的现在是软实时的。

    最后,还有很多工具和 GHC 标志可以提高性能:

    然后是编码:使用未装箱的类型(无 GC),最小化惰性结构分配。以打包形式保存长期存在的数据。测试和基准测试。

    我想你会没事的。

    【讨论】:

    • Don 在哪个 GHC 版本中引入了这些每线程堆? GHC 文档中有详细信息吗? (我试过谷歌搜索,但没有发现任何特别的东西)
    • 感谢您提醒我重新访问此内容。根据 GHC 状态报告,per-thread GC 仍然在一个分支中,而不是在主线中。我已链接到报告和状态。
    【解决方案3】:

    我没有遇到过 GC 暂停的问题,只要你不为所有事情都使用惰性列表,就不应该产生太多垃圾。

    不过,对于多线程应用程序来说,Sky 并不是那么明亮。 GHC 仍然没有具有线程优先级的调度程序,如果您使用线程进行繁重的后台处理,您很容易使您的事件循环饿死。

    【讨论】:

    • 我不熟悉 GHC 的严格性分析 (haskell.org/haskellwiki/Performance/Strictness)。我的理解是,在很多情况下,它会自动地严格化事物,包括列表。 (假设优化级别设置得足够高。)那么您是说我应该确保以 GHC 可以在适当的情况下使事情变得严格的方式进行编码?
    【解决方案4】:

    你见过这些吗:

    另外,我建议联系Multicore Garbage Collection with Local Heaps 论文(ISMM 2011)的作者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 2019-01-01
      • 1970-01-01
      相关资源
      最近更新 更多