【问题标题】:How to cap memory usage of Haskell threads如何限制 Haskell 线程的内存使用量
【发布时间】:2011-09-04 05:54:12
【问题描述】:

在使用 GHC 编译的 Haskell 程序中,是否可以以编程方式防止过度使用内存?也就是说,让它在内存使用量达到指定限制时通知程序,最好是指示有问题的线程。

例如,假设我想编写一个服务器,托管一个脚本语言解释器,用户可以连接到该服务器。它是图灵完备的,因此程序理论上可以使用无限的内存或时间。假设每个客户端都由一个单独的线程处理。如果客户端编写了一个非常快速地消耗内存的无限循环,我想确保线程消耗的内存不超过 1 MB,然后才会收到异常警报。当这种情况发生时,我不希望其他用户受到影响。

这可能使用单独的进程和ulimit,但是:

  • 我宁愿将其保留在一个程序中,以避免进程间通信的复杂性。

  • 我需要同时支持 Linux 和 Windows,所以如果可能的话,我希望它与平台无关。

【问题讨论】:

  • 我认为使用RTS options 可以做到这一点。 -M 选项看起来特别有希望,但我不确定它本身是否足够。
  • 我在当前项目中遇到了同样的问题。有一个related question 的答案建议计算分配,但我觉得它并不令人满意——如果可能的话,我想直接限制实时内存集。
  • AFAIK,没有为单个线程定义内存消耗,只有进程。

标签: memory haskell ghc


【解决方案1】:

Edward Z. Yang 和 David Mazières 开发了支持动态资源限制的 GHC 扩展,并在 http://ezyang.com/rlimits.html 上讨论它,他们还提供了支持此功能的 GHC 7.8 版本。

很遗憾,他们的工作并未包含在 GHC 上游。

【讨论】:

    【解决方案2】:

    可能不是你想要的。但是,正如 here 所记录的,您有一个 ghc 编译选项: -Ksize更新:糟糕,抱歉,-K 用于堆栈溢出。不过,您可以检查该链接。

    【讨论】:

      【解决方案3】:

      在您的示例中,您可能需要修改脚本语言解释器的源代码,对内存管理进行一些调整。模块,当然,如果它具有一些托管内存分配功能,解释器可以通过 API 回调到您的主机应用程序来抱怨内存配额的过度使用。

      【讨论】:

      • 解释器是我打算用 Haskell 编写的。除非我分配内存manually(这基本上违背了用 Haskell 编写它的目的),否则我对 GHC 分配器的功能感兴趣。
      • @Joey Adams:为此,您需要有一个内存所有权的概念。然而,在通用分配器中,它不必要地使事情复杂化 - 例如,如果线程终止并且其他线程正在使用它怎么办(当您使用 par 等时很常见)。
      猜你喜欢
      • 2016-05-22
      • 2017-07-10
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      相关资源
      最近更新 更多