[GHC] #7606: Stride scheduling for Haskell threads with priorities
GHC
cvs-ghc at haskell.org
Tue Feb 5 03:06:21 CET 2013
#7606: Stride scheduling for Haskell threads with priorities
---------------------------------+------------------------------------------
Reporter: ezyang | Owner: ezyang
Type: feature request | Status: new
Priority: normal | Milestone: 7.8.1
Component: Runtime System | Version: 7.7
Keywords: | Os: Unknown/Multiple
Architecture: Unknown/Multiple | Failure: None/Unknown
Difficulty: Unknown | Testcase:
Blockedby: | Blocking:
Related: |
---------------------------------+------------------------------------------
Comment(by ezyang):
OK, here's a new progress report.
The red-black tree implementation is now behaving very consistently and
with only 1-3% overhead. (Right now, it uses a malloc'd free list of red-
black tree nodes; this ended up being quicker than using heap allocated
stuff.) Unfortunately, sleeper fairness (with the objective of giving
sleepy threads a bit of a boost) makes all of the benchmarks perform
worse; in part due to the fact that sleepy threads increase the overhead
of managing processes, since they tend to have different priorities. I
don't at the moment have a good way of measuring latency change, see #7659
for a bug related to that. Additionally, the impact of scheduling is
fairly hard on some test programs I’ve constructed unless you insert
explicit yields into your programs. One more worse thing is that the the
rb-trees are synthetically constructed to get a performance boost when all
threads have the same priority; when threads have different priorities you
will immediately see a slowdown because more rb-tree manipulations will
become necessary.)
The array heap implementation has lower overhead (0-2%) but is far more
inconsistent; some benchmarks do much worse. Right now it’s still pretty
unclear where all of this overhead is coming from.
The end conclusion is as follows: if red-black trees end up being the
dominant implementation, then there is still a chance that we can replace
the current scheduler wholesale, since its runtime characteristics are
very similar to the current scheduler. (Sleeper fairness will need to
continue to be a configurable option, assuming we can prove that it
improves latency.) However, if array heaps end up having much better
properties on prioritized workloads (test-cases of which I have not
constructed yet), I find it highly implausible that we’ll be able to
finesse the implementation to work identically to the current scheduler,
and we will need to support both. On the plus side, because I have made so
many implementations I have a good sense refactor the API properly.
I’ll attach some patches, but the comments still need some cleaning up.
rbtrees:
{{{
--------------------------------------------------------------------------------
Program Size Allocs Runtime Elapsed TotalMem
--------------------------------------------------------------------------------
callback001 +0.2% +0.0% +2.2% +1.9% -2.0%
callback002 +0.2% +0.0% +1.7% +1.6% +0.0%
chan +0.2% +0.0% +2.1% +2.1% +0.6%
sieve +0.2% +0.0% +2.5% +2.6% +0.0%
threads001 +0.2% +0.0% +1.7% +1.5% +0.0%
threads003 +0.2% +0.0% -8.9% -8.8% +12.7%
threads006 +0.2% +0.0% +1.6% +0.8% -3.2%
threads007 +0.2% -0.0% +2.9% +3.0% -0.0%
--------------------------------------------------------------------------------
Min +0.2% -0.0% -8.9% -8.8% -3.2%
Max +0.2% +0.0% +2.9% +3.0% +12.7%
Geometric Mean +0.2% +0.0% +0.7% +0.5% +0.9%
}}}
heap arrays (using emulated ordering in order to recreate thread
conditions)
{{{
--------------------------------------------------------------------------------
Program Size Allocs Runtime Elapsed TotalMem
--------------------------------------------------------------------------------
callback001 +0.1% +0.0% +2.1% +2.0% -2.0%
callback002 +0.1% +0.0% +1.3% +1.3% +0.0%
chan +0.1% +0.0% +0.5% +0.4% +0.0%
sieve +0.1% +0.0% -0.7% -0.7% +0.0%
threads001 +0.1% +0.0% -0.6% -0.7% +0.0%
threads003 +0.1% +0.0% +62.0% +62.4% -3.2%
threads006 +0.1% +0.0% +6.0% +5.8% -3.2%
threads007 +0.1% +0.0% +6.7% +6.8% -8.3%
--------------------------------------------------------------------------------
Min +0.1% +0.0% -0.7% -0.7% -8.3%
Max +0.1% +0.0% +62.0% +62.4% +0.0%
Geometric Mean +0.1% +0.0% +8.2% +8.2% -2.1%
}}}
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7606#comment:27>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list