我正在使用一個在 Haskell 中編碼的程式,我傳遞給它 RTS -N3 -M9G -s -RTS以便在執行結束時獲取運行時統計資訊。我偶爾會遇到生產力為負的結果。此外,該程式成功運行了其任務,但 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
1 最后的時間是因為我正在呼叫 $ time <program> RTS -N3 -M9G -s -RTS <args-for-program>
作業系統:Ubuntu 18.04.6 LTS
uj5u.com熱心網友回復:
計算出的 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 問題,除了關于一般 Windows CPU 時間不精確的報告和一些可能不相關的負面 MUT 報告here和here之外,我沒有看到任何有用的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/365072.html
上一篇:GHC中函式引數的行內
