Haskell 的运行时统计数据中的负生产力

Negative productivity in Haskell's runtime statistics

我在执行结束时使用 program coded in Haskell to which I passed +RTS -N3 -M9G -s -RTS in order to obtain runtime statistics。我偶尔会遇到生产力为负的结果。此外,程序 运行 其任务成功但 MUT 为零。

  1. 为什么生产力是负数?
  2. 如果程序成功完成,MUT怎么可能为零?

3,904,320,026,552 bytes allocated in the heap
4,110,237,505,912 bytes copied during GC
   6,874,676,192 bytes maximum residency (706 sample(s))
      16,352,288 bytes maximum slop
            9369 MiB total memory in use (0 MB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0     2402028 colls, 987034 par   39844.808s  1005.947s     0.0004s    0.0150s
  Gen  1       706 colls,   583 par   1165.131s  1730.422s     2.4510s    17.6798s

  Parallel GC work balance: 70.86% (serial 0%, perfect 100%)

  TASKS: 8 (1 bound, 7 peak workers (7 total), using -N3)

  SPARKS: 36096 (16594 converted, 0 overflowed, 0 dud, 5857 GC'd, 13645 fizzled)

  INIT    time    0.003s  (  0.002s elapsed)
  MUT     time    0.000s  (789.778s elapsed)
  GC      time  41009.939s  (2736.369s elapsed)
  EXIT    time    2.253s  (  0.001s elapsed)
  Total   time  5072.554s  (3526.151s elapsed)

  Alloc rate    0 bytes per MUT second

  Productivity -708.5% of total user, 22.4% of total elapsed


real   58m46,534s
user   80m23,692s
sys     4m9,296s

¹ 最后的时间是因为我正在调用 $ time <program> +RTS -N3 -M9G -s -RTS <args-for-program>

OS:Ubuntu 18.04.6 LTS

计算出的 GC CPU 时间似乎有问题。与过去的 2737 秒相比,它是 41010 秒,如果您只有 运行 三项功能,这没有意义。

这个计算错误意味着计算出的 MUT CPU 时间,也就是总 CPU 时间减去 INIT、GC 和 EXIT 时间,实际上是一个很大的负数 (5073-41010-2 = -35939)。这给出了 -35939/5073=-708% 的生产率。当显示 MUT 秒数时,负数被截断为零,以避免在 MUT 非常低且存在时钟精度错误时报告小负数,这就是为什么显示的 MUT 时间为 0 而不是 -35939。

我不知道为什么 GC 时间计算得如此严重。我最好的猜测是这个。如果您在 Windows 上 运行,CPU 时间时钟精度存在已知问题,并且垃圾收集时间的某些异常模式可能会导致精度错误仅发生在一个方向,稍微高估实际 GC 时间比低估它更频繁。超过 240 万次收集(查看您的 GC 统计数据),这种差异可能会累积成巨大的正错误。

我查看了 GitLab 问题,除了 the report on general Windows CPU time imprecision and a couple of probably unrelated negative MUT reports here and here,我没有看到任何有用的东西。