[GHC] #13164: idle time full GCs (idle cpu usage)
GHC
ghc-devs at haskell.org
Sat Jan 21 20:33:39 UTC 2017
#13164: idle time full GCs (idle cpu usage)
-------------------------------------+-------------------------------------
Reporter: lspitzner | Owner:
Type: feature | Status: new
request |
Priority: normal | Milestone:
Component: Runtime | Version: 8.0.1
System |
Keywords: idle GC | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
In an interactive program I noticed idle CPU usage of ~12% due to the full
GCs done by the RTS on default settings. For this specific usecase this is
a lot of wasted CPU cycles for no gain. Passing {{{-I0}}} to the RTS
"fixes" this; nonetheless I think that the default behaviour could/should
be improved, even when considering other usecases where full GCs are a
good choice.
The program in question keeps ~50MB allocated on the heap but does close
to no short-lived allocations in between the idle GCs. Some relevant data
from the summary:
{{{
930,569,008 bytes allocated in the heap
4,847,446,928 bytes copied during GC
46,255,056 bytes maximum residency (111 sample(s))
378,200 bytes maximum slop
94 MB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max
pause
Gen 0 1784 colls, 0 par 0.123s 0.100s 0.0001s
0.0006s
Gen 1 111 colls, 0 par 9.377s 9.418s 0.0848s
0.1099s
INIT time 0.000s ( 0.003s elapsed)
MUT time 2.250s ( 95.029s elapsed)
GC time 9.500s ( 9.518s elapsed)
RP time 0.000s ( 0.000s elapsed)
PROF time 0.000s ( 0.000s elapsed)
EXIT time 0.007s ( 0.008s elapsed)
Total time 11.760s (104.557s elapsed)
}}}
The detailed GC statistics of the idle GCs look like
{{{
Alloc Copied Live GC GC TOT TOT Page Flts
bytes bytes bytes user elap user elap
13304 45958728 46210536 0.070 0.068 0.920 1.550 0 0
(Gen: 1)
11568 45958720 46210536 0.100 0.102 1.043 2.584 0 0
(Gen: 1)
15432 45958720 46210536 0.103 0.105 1.167 3.588 0 0
(Gen: 1)
11568 45958720 46210536 0.100 0.102 1.287 4.586 0 0
(Gen: 1)
11568 45958720 46210536 0.107 0.107 1.413 5.592 0 0
(Gen: 1)
11568 45958720 46210536 0.073 0.080 1.503 6.566 0 0
(Gen: 1)
11568 45958720 46210536 0.073 0.073 1.593 7.560 0 0
(Gen: 1)
11568 45958720 46210536 0.067 0.068 1.677 8.557 0 0
(Gen: 1)
}}}
I don't really know what exactly "alloc bytes" means, but my guess is that
those numbers are indeed fairly low and those GCs are mostly useless.
To clarify the intention of this request: '''Tweak the idle GC (default)
configuration in some way so that interactive programs with moderate heap
use reasonable amount of CPU time while idle.'''
And "reasonable" is intentionally vague as I don't know how to weight
other usecases.
Minimal example:
{{{
import Control.Concurrent
main :: IO ()
main = do
let large = [1..1000000]
print $ length large
[1..20] `forM_` \_ -> do
threadDelay 400000
print $ sum large
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13164>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list