Overhaul GC stats
authorSimon Marlow <marlowsd@gmail.com>
Fri, 25 Nov 2016 16:45:43 +0000 (16:45 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 6 Dec 2016 15:25:50 +0000 (15:25 +0000)
commit24e6594cc7890babe69b8ba122d171affabad2d1
tree0efef02a3e03787e9e6ee9822cb20efc7d48fec5
parenteec02ab7c8433465cc8d6be0a8889e7c6a222fb0
Overhaul GC stats

Summary:
Visible API changes:

* The C struct `GCDetails` gives the stats about a single GC.  This is
  passed to the `gcDone()` callback if one is set via the
  RtsConfig. (previously we just passed a collection of values, so this
  is more extensible, at the expense of breaking the existing API)

* `RTSStats` gives cumulative stats since the start of the program,
  and includes the `GCDetails` for the most recent GC.  This struct
  can be obtained via `getRTSStats()` (the old `getGCStats()` has been
  removed, and `getGCStatsEnabled()` has been renamed to
  `getRTSStatsEnabled()`)

Improvements:

* The per-GC stats and cumulative stats are now cleanly separated.

* Inside the RTS we have a top-level `RTSStats` struct to keep all our
  stats in, previously this was just a collection of strangely-named
  variables.  This struct is mostly just copied in `getRTSStats()`, so
  the implementation of that function is a lot shorter.

* Types are more consistent.  We use a uint64_t byte count for all
  memory values, and Time for all time values.

* Names are more consistent.  We use a suffix `_bytes` for all byte
  counts and `_ns` for all time values.

* We now collect information about the amount of memory in large
  objects and compact objects in `GCDetails`. (the latter was the reason
  I started doing this patch but it seems to have ballooned a bit!)

* I fixed a bug in the calculation of the elapsed MUT time, and added
  an ASSERT to stop the calculations going wrong in the future.

For now I kept the Haskell API in `GHC.Stats` the same, by
impedence-matching with the new API.  We could either break that API
and make it match the C API more closely, or we could add a new API
and deprecate the old one.  Opinions welcome.

This stuff is very easy to get wrong, and it's hard to test.  Reviews
welcome!

Test Plan:
manual testing
validate

Reviewers: bgamari, niteria, austin, ezyang, hvr, erikd, rwbarton, Phyx

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2756
includes/Rts.h
includes/RtsAPI.h
includes/rts/Time.h [new file with mode: 0644]
includes/rts/storage/GC.h
libraries/base/GHC/Stats.hsc
rts/RtsSymbols.c
rts/Stats.c
rts/Stats.h
rts/sm/GC.c
rts/sm/Storage.c
rts/sm/Storage.h