Skip to content
  • Simon Marlow's avatar
    Overhaul GC stats · 24e6594c
    Simon Marlow authored
    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
    24e6594c