[Haskell-cafe] Re: Real-time garbage collection for Haskell
Simon Marlow
marlowsd at gmail.com
Tue Mar 2 09:17:41 EST 2010
On 01/03/2010 17:16, Sebastian Sylvan wrote:
>
>
> On Sun, Feb 28, 2010 at 5:20 AM, Luke Palmer <lrpalmer at gmail.com
> <mailto:lrpalmer at gmail.com>> wrote:
>
> I have seen some proposals around here for SoC projects and other
> things to try to improve the latency of GHC's garbage collector. I'm
> currently developing a game in Haskell, and even 100ms pauses are
> unacceptable for a real-time game. I'm calling out to people who have
> seen or made such proposals, because I would be willing to contribute
> funding and/or mentor a project that would contribute to this goal.
> Also any ideas for reducing this latency in other ways would be very
> appreciated.
>
>
> Since we're talking games here (my profession), I'd point out that it
> would be cool to be able to supply "hints" to the GC about when might be
> a good time to do a GC (without unconditionally forcing it), games in
> particular have some pretty specific properties that may be exploitable.
>
> Presumably a non-trivial portion of the objects copied from the
> nursery/G0 are actually short-lived objects that just happened to have
> their short life-span overlap with the collection. So really, copying
> them to the next generation is a "mistake" in some sense.
There's a technique we use, that mitigates the effect of this to some
extent, called "aging". The idea is that an object is only promoted if
it survives at least N GCs in the young generation. Typically N=2 is a
good value, so an object that is allocated just before a minor GC will
be copied, but probably not promoted unless it survives all the way to
the next GC. You can also use fractional values of N and in fact you
should measure N in terms of bytes allocated rather than GCs. In GHC
6.12.1 you can tune the amount of aging with +RTS -T<n>, but I removed
the option in 6.14 in order to make the GC implementation simpler, we
now have a fixed aging -T2 aging policy. In practice other values were
very rarely any better, in fact.
> For games,
> though, we have a very good point that occurs regularly where we know
> that all/most short-lived objects will no longer be referenced - at the
> start of a fresh frame.
System.Mem.performGC is your friend, but if you're unlucky it might do a
major GC and then you'll get more pause than you bargained for.
Cheers,
Simon
More information about the Haskell-Cafe
mailing list