This post is just there to store a nugget of haskell configuration somewhere and maybe help others. So if you’re having trouble with
-with-rtsopts and multiple RTS options, here’s how to do it:
executable my-exe ghc-options: -threaded -rtsopts "-with-rtsopts=-N -T"
Notice the quotes around the whole
-with-rtsopts (you can also use multiple
-with-rtsopts flags). Turns out cabal splits on spaces and inserts quotes everywhere. Yay shotgun parsers!
Now that’s out of the way, here’s a little context.
Thanks @alpmestan for giving me the solution!
To make an executable program, the GHC system compiles your code and then links it with a non-trivial runtime system (RTS)
(The emphasis on non-trivial is mine).
The RTS handles garbage collection, light threading and a lot of other things.
You can pass
RTS options to an existing binary:
./my-exe +RTS -N -T -RTS GHCRTS="-T -N" ./my-exe
If you want to pass default options when compiling the binary, you can use
-with-rtsopts in your cabal config file.
-N option enables the parallel runtime, which will use the multiple cores to improve performance.
-N is added by default in the
stack-new template, so you may already use it.
At Clever Cloud, we’re working on a new metrics system, capable of gathering user-defined metrics about applications. Since haskell has ekg, we’re working on a top-notch ekg integration :-)
I already gather WAI metrics (latency distribution, request count, error count, etc…), but I wanted to also fetch GC stats. It’s super easy to do with ekg (
registerGcMetrics), but it depends on runtime tracing to be enabled with
-T. The ekg docs says
-T is super lightweight and is a good default. I’ve not done proper benchmarking about it though.
If you want an example of how easy it is to setup GC + WAI metrics with EKG, and report it through statsd, have a look at my homepage: https://github.com/divarvel/physical-homepage/blob/master/app/Main.hs#L22
Since I’ve had trouble finding a solution with a search engine, I’ll just put various queries I’ve tried in hope it will help other people find the solution.
-with-rtsopts=-NT -with-rtsopts=-N -T -with-rtsopts=-N-T -with-rtsopts=-N-T ghc: unrecognised flag: -T ghc: unrecognised flag: -N