[GHC] #7606: Stride scheduling for Haskell threads with priorities

GHC cvs-ghc at haskell.org
Thu Jan 24 21:24:59 CET 2013


#7606: Stride scheduling for Haskell threads with priorities
---------------------------------+------------------------------------------
    Reporter:  ezyang            |       Owner:  ezyang          
        Type:  feature request   |      Status:  new             
    Priority:  normal            |   Milestone:  7.8.1           
   Component:  Runtime System    |     Version:  7.7             
    Keywords:                    |          Os:  Unknown/Multiple
Architecture:  Unknown/Multiple  |     Failure:  None/Unknown    
  Difficulty:  Unknown           |    Testcase:                  
   Blockedby:                    |    Blocking:                  
     Related:                    |  
---------------------------------+------------------------------------------

Comment(by ezyang):

 Copied memory is affected disproportionately:

 {{{
 [ezyang at hs01 threads006]$ ./Main-big 200000 +RTS -s
      224,198,416 bytes allocated in the heap
      853,296,496 bytes copied during GC
      197,453,072 bytes maximum residency (10 sample(s))
       25,701,000 bytes maximum slop
              426 MB total memory in use (0 MB lost due to fragmentation)

 [ezyang at hs01 threads006]$ ./Main-medium 200000 +RTS -s
      224,198,416 bytes allocated in the heap
      690,756,096 bytes copied during GC
      125,998,552 bytes maximum residency (9 sample(s))
       24,121,032 bytes maximum slop
              270 MB total memory in use (0 MB lost due to fragmentation)
 }}}

 That's an over 150MB jump.

 I think I have an important clue, though; consider these three runs on the
 big TSO executable:

 {{{
 [ezyang at hs01 threads006]$ ./Main-big 182260 +RTS -s
      204,318,544 bytes allocated in the heap
      622,311,352 bytes copied during GC
      110,659,024 bytes maximum residency (9 sample(s))
       23,499,512 bytes maximum slop
              239 MB total memory in use (0 MB lost due to fragmentation)

 [ezyang at hs01 threads006]$ ./Main-big 182261 +RTS -s
      204,319,648 bytes allocated in the heap
      622,313,432 bytes copied during GC
      110,659,024 bytes maximum residency (9 sample(s))
       23,453,024 bytes maximum slop
              239 MB total memory in use (0 MB lost due to fragmentation)

 [ezyang at hs01 threads006]$ ./Main-big 182262 +RTS -s
      204,320,752 bytes allocated in the heap
      791,958,776 bytes copied during GC
      169,695,072 bytes maximum residency (10 sample(s))
       23,503,128 bytes maximum slop
              395 MB total memory in use (0 MB lost due to fragmentation)
 }}}

 Wow! In the case of the 182262th thread, it's literally the straw that
 broke the camel's back. I went ahead and logged GC events. The breakpoint
 occurs here:

 {{{
 ----------------------------------------------------------
   Gen     Max  Mut-list  Blocks    Large     Live     Slop
        Blocks     Bytes          Objects
 ----------------------------------------------------------
     0   53762         0       2        0     1184     7008
     1   53762         3   53766       94 196721432 23504104
 ----------------------------------------------------------
                                          196722616 23511112
 ----------------------------------------------------------

 Memory inventory:
   gen 0 blocks :     1 blocks (   0.0 MB)
   gen 1 blocks : 53766 blocks ( 210.0 MB)
   nursery      :   129 blocks (   0.5 MB)
   retainer     :     0 blocks (   0.0 MB)
   arena blocks :     0 blocks (   0.0 MB)
   exec         :     0 blocks (   0.0 MB)
   free         :  6332 blocks (  24.7 MB)
   total        : 60228 blocks ( 235.3 MB)
 alloc new todo block 0x7f13c7aff000 for gen  0
 alloc new todo block 0x7f13c7ca1000 for gen  1

 [snip]

 ----------------------------------------------------------
   Gen     Max  Mut-list  Blocks    Large     Live     Slop
        Blocks     Bytes          Objects
 ----------------------------------------------------------
     0   82858         0       2        0      104     8088
     1   82858         1   45569        3 169695176 16955448
 ----------------------------------------------------------
                                          169695280 16963536
 ----------------------------------------------------------

 Memory inventory:
   gen 0 blocks :     1 blocks (   0.0 MB)
   gen 1 blocks : 45569 blocks ( 178.0 MB)
   nursery      :   129 blocks (   0.5 MB)
   retainer     :     0 blocks (   0.0 MB)
   arena blocks :     0 blocks (   0.0 MB)
   exec         :     0 blocks (   0.0 MB)
   free         : 53841 blocks ( 210.3 MB)
   total        : 99540 blocks ( 388.8 MB)


 }}}

 Inside the snip, approximately a 100 hundred megablocks are allocated as
 TODO space for scavenge, ala

 {{{
 allocated 1 megablock(s) at 0x7f13b5a00000
 alloc new todo block 0x7f13b5a04000 for gen  1
 increasing limit for 0x7f13b5a04000 to 0x7f13b5a04800
 }}}

 It seems we run out of todo blocks while evacuating, and then essentially
 need to copy our entire heap. Ouch! Unfortunately, I don't know enough to
 say if this is a GC bug or not.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7606#comment:21>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the ghc-tickets mailing list