[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