rts: Add --internal-counters RTS flag and several counters
authorDouglas Wilson <douglas.wilson@gmail.com>
Mon, 19 Mar 2018 15:55:37 +0000 (11:55 -0400)
committerBen Gamari <ben@smart-cactus.org>
Mon, 19 Mar 2018 16:05:07 +0000 (12:05 -0400)
commit2918abf75594001deed51ee252a05b146f844489
treeecb789d307060dc887e2dfe01eb390a9c475e8f7
parentf9a6d4207fb0e551821fee847ac064ac31d96bba
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
21 files changed:
docs/users_guide/runtime_control.rst
includes/RtsAPI.h
includes/rts/Flags.h
includes/rts/SpinLock.h
includes/rts/storage/GC.h
libraries/base/GHC/RTS/Flags.hsc
rts/Messages.c
rts/Messages.h
rts/RtsFlags.c
rts/SMPClosureOps.h
rts/Stats.c
rts/Stats.h
rts/StgMiscClosures.cmm
rts/ThreadPaused.c
rts/ThreadPaused.h
rts/sm/Evac.c
rts/sm/GC.c
rts/sm/GC.h
testsuite/tests/rts/InternalCounters.stdout [new file with mode: 0644]
testsuite/tests/rts/Makefile
testsuite/tests/rts/all.T