了解 GHC 的 +RTS -t -RTS 选项的输出

use*_*669 5 haskell ghc

我正在对使用 GHC 编译的 haskell 程序的内存消耗进行基准测试。为此,我使用以下命令行参数运行该程序:+RTS -t -RTS。下面是一个示例输出:\n <<ghc: 86319295256 bytes, 160722 GCs, 53963869/75978648 avg/max bytes residency (386 samples), 191M in use, 0.00 INIT (0.00 elapsed), 152.69 MUT (152.62 elapsed), 58.85 GC (58.82 elapsed) :ghc>>。\n根据 ghc 手册,输出显示:

\n\n
    \n
  • 程序在整个运行过程中分配的字节总数。
  • \n
  • 执行的垃圾收集总数。
  • \n
  • 平均和最大“驻留”,即实时数据量(以字节为单位)。运行时只能确定一次Major GC期间的实时数据量,这就是为什么样本数量对应于Major GC的数量(并且通常相对较小)。
  • \n
  • RTS 从操作系统分配的峰值内存。
  • \n
  • 初始化运行时系统 (INIT)、运行程序本身(MUT、变异器)和垃圾收集 (GC) 时的 CPU 时间量和已用的挂钟时间。
  • \n
\n\n

应用于我的示例,这意味着我的程序会混洗 82321 MiB(字节除以 1024^2),执行 160722 次垃圾收集,具有 51MiB/72MiB 平均/最大内存驻留,在 RAM 中分配最多 191M 内存等等。 ..

\n\n

现在我想知道,\xc2\xbb 的平均和最大“驻留”(即以字节为单位的实时数据量)\xc2\xab 与 \xc2\xbbRTS 从 OS\xc2\ 分配的峰值内存相比哈布?还有:大约120M的剩余空间用来做什么?

\n\n

有人向我指出了更多信息,但这并没有明确说明我想知道什么。另一个来源(5.4.4第二项)暗示120M内存用于垃圾收集。但这太模糊了 \xe2\x80\x93 我需要一个可引用的信息源。

\n\n

那么请问,有没有人可以用好的资料作为证据来回答我的问题?

\n\n

亲切的问候!

\n

Mat*_*hid 4

“常驻”大小是您拥有多少实时 Haskell 数据。从操作系统实际分配的内存量可能会更高。

  • RTS 以“块”的形式分配内存。如果您的程序需要 7.3 块 RAM,则 RTS 必须分配 8 块,其中 0.7 块是空闲空间。

  • 默认垃圾收集算法是 2 空间收集器。也就是说,当空间 A 填满时,它会分配空间 B(完全是空的),并将所有实时数据从空间 A 复制到空间 B 中,然后释放空间 A。这意味着,在一段时间内,您处于使用实际需要的 2 倍内存。(我相信某处有一个开关可以使用 1 空间算法,该算法速度较慢,但​​使用的 RAM 较少。)

管理线程也有一些开销(特别是如果你有很多线程),并且可能还有其他一些事情。

我不知道您对 GC 技术了解多少,但您可以尝试阅读以下内容: