Detect overly long GC sync
authorSimon Marlow <marlowsd@gmail.com>
Wed, 11 Feb 2015 14:19:21 +0000 (14:19 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 16 Nov 2017 13:49:05 +0000 (13:49 +0000)
commit2f4638735ad1526d6502a4706bffafffb93e24da
tree8711e34b498ea52d0a8092fb763892c07c602d92
parent07ac921f48baea84b40835b0b7c476806f7f63f6
Detect overly long GC sync

Summary:
GC sync is the time between a GC being intiated and all the mutator
threads finally stopping so that the GC can start. Problems that cause
the GC sync to be delayed are hard to find and can cause dramatic
slowdowns for heavily parallel programs.

The new flag --long-gc-sync=<time> helps by emitting a warning and
calling a user-overridable hook when the GC sync time exceeds the
specified threshold. A debugger can be used to set a breakpoint when
this happens and inspect the stacks of threads to find the culprit.

Test Plan:
```
$ ./inplace/bin/ghc-stage2 +RTS --long-gc-sync=0.0000001 -S
    Alloc    Copied     Live     GC     GC      TOT      TOT  Page Flts
    bytes     bytes     bytes   user   elap     user     elap
  1135856     51144    153736  0.000  0.000    0.002    0.002    0    0  (Gen:  0)
  1034760     94704    188752  0.000  0.000    0.002    0.002    0    0  (Gen:  0)
  1038888    134832    228888  0.009  0.009    0.011    0.011    0    0  (Gen:  1)
  1025288     90128    235184  0.000  0.000    0.012    0.012    0    0  (Gen:  0)
  1049088    130080    333984  0.000  0.000    0.013    0.013    0    0  (Gen:  0)
Warning: waited 0us for GC sync
  1034424     73360    331976  0.000  0.000    0.013    0.013    0    0  (Gen:  0)
```

Also tested on a real production problem.

Reviewers: niteria, bgamari, erikd

Subscribers: rwbarton, thomie

Differential Revision: https://phabricator.haskell.org/D4193
docs/users_guide/runtime_control.rst
includes/RtsAPI.h
includes/rts/Flags.h
rts/RtsFlags.c
rts/hooks/Hooks.h
rts/hooks/LongGCSync.c [new file with mode: 0644]
rts/sm/GC.c
rts/sm/GCThread.h