Forcing apps to collect GC stats?

Austin Seipp austin at well-typed.com
Thu Jul 31 17:49:31 UTC 2014


Right, so if you look in ./includes/rts/Flags.h, you'll see a set of
different options for the GC stats:

#define NO_GC_STATS      0
#define COLLECT_GC_STATS 1
#define ONELINE_GC_STATS 2
#define SUMMARY_GC_STATS 3
#define VERBOSE_GC_STATS 4

By default the RTS sets the stats flag to NO_GC_STATS, which does
nothing. Note that *every* flag here (except NO_GC_STATS) implies the
collection of GC statistics; it's just a matter of what's displayed to
the user (if anything).

There are several RTS options, each of which correspond to one of the
above (see RtsFlags.c):

`+RTS -T` corresponds to COLLECT_GC_STATS
`+RTS -S` corresponds to VERBOSE_GC_STATS
`+RTS -s` corresponds to SUMMARY_GC_STATS
`+RTS -t` corresponds to ONELINE_GC_STATS

These flags are parsed at startup before any Haskell code is executed
obviously. So here's the problem: let's say you unconditionally force
the statistics flag to be COLLECT_GC_STATS from Haskell-land - if I
started my application with `+RTS -s`, then you've changed the
statistics reporting from SUMMARY_GC_STATS, which means that when the
program terminates, no statistics about the program will be displayed!
Which will break end-user expectations.

So the rule of thumb is: all of the above flags enforce the collection
of statistics, and you *only* want to set the flag to COLLECT_GC_STATS
*iff* it is currently set to NO_GC_STATS. In all other cases, GC
statistics will already be enabled for the runtime, so you don't need
to do anything.

Hope that explains it well enough.

On Thu, Jul 31, 2014 at 12:17 PM, Johan Tibell <johan.tibell at gmail.com> wrote:
> On Thu, Jul 31, 2014 at 6:55 PM, Austin Seipp <austin at well-typed.com> wrote:
>> And also, take note the conditional is very specific; you want
>> COLLECT_GC_STATS only when NO_GC_STATS is the current setting - if you
>> unconditionally force COLLECT_GC_STATS, then things like `+RTS
>> -sstderr -RTS` will no longer work. I mention this because I messed it
>> up originally. :)
>
> Could you expand a bit on this. I want to programtically set whatever
> flags/settings would be set if the user passed +RTS -T on the command
> line.
>



-- 
Regards,

Austin Seipp, Haskell Consultant
Well-Typed LLP, http://www.well-typed.com/


More information about the ghc-devs mailing list