[GHC] #3553: parallel gc suffers badly if one thread is descheduled

GHC ghc-devs at haskell.org
Mon Mar 19 16:37:28 UTC 2018


#3553: parallel gc suffers badly if one thread is descheduled
-------------------------------------+-------------------------------------
        Reporter:  simonmar          |                Owner:  simonmar
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:  6.12.2
       Component:  Runtime System    |              Version:  6.10.4
      Resolution:  fixed             |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by Ben Gamari <ben@…>):

 In [changeset:"2918abf75594001deed51ee252a05b146f844489/ghc"
 2918abf7/ghc]:
 {{{
 #!CommitTicketReference repository="ghc"
 revision="2918abf75594001deed51ee252a05b146f844489"
 rts: Add --internal-counters RTS flag and several counters

 The existing internal counters:
 * gc_alloc_block_sync
 * whitehole_spin
 * gen[g].sync
 * gen[1].sync

 are now not shown in the -s report unless --internal-counters is also
 passed.

 If --internal-counters is passed we now show the counters above,
 reformatted, as
 well as several other counters. In particular, we now count the
 yieldThread()
 calls that SpinLocks do as well as their spins.

 The added counters are:
 * gc_spin (spin and yield)
 * mut_spin (spin and yield)
 * whitehole_threadPaused (spin only)
 * whitehole_executeMessage (spin only)
 * whitehole_lockClosure (spin only)
 * waitForGcThreadsd (spin and yield)

 As well as the following, which are not SpinLock-like things:
 * any_work
 * do_work
 * scav_find_work

 See the Note for descriptions of what these counters are.

 We add busy_wait_nops in these loops along with the counter increment
 where it
 was absent.

 Old internal counters output:
 ```
 gc_alloc_block_sync: 0
 whitehole_gc_spin: 0
 gen[0].sync: 0
 gen[1].sync: 0
 ```

 New internal counters output:
 ```
 Internal Counters:
                                            Spins        Yields
     gc_alloc_block_sync                      323             0
     gc_spin                              9016713           752
     mut_spin                            57360944         47716
     whitehole_gc                               0           n/a
     whitehole_threadPaused                     0           n/a
     whitehole_executeMessage                   0           n/a
     whitehole_lockClosure                      0             0
     waitForGcThreads                           2           415
     gen[0].sync                                6             0
     gen[1].sync                                1             0

     any_work                                2017
     no_work                                 2014
     scav_find_work                          1004
 ```

 Test Plan:
 ./validate

 Check it builds with #define PROF_SPIN removed from includes/rts/Config.h

 Reviewers: bgamari, erikd, simonmar, hvr

 Reviewed By: simonmar

 Subscribers: rwbarton, thomie, carter

 GHC Trac Issues: #3553, #9221

 Differential Revision: https://phabricator.haskell.org/D4302
 }}}

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


More information about the ghc-tickets mailing list