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 为零。
- 为什么生产力是负数?
- 如果程序成功完成,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,我没有看到任何有用的东西。
我在执行结束时使用 program coded in Haskell to which I passed +RTS -N3 -M9G -s -RTS
in order to obtain runtime statistics。我偶尔会遇到生产力为负的结果。此外,程序 运行 其任务成功但 MUT 为零。
- 为什么生产力是负数?
- 如果程序成功完成,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,我没有看到任何有用的东西。