Suppose that I have a program that only spawn threads using forkOn
. In such scenario, there will be no load balancing of Haskell threads among different capabilities. So is there a difference in executing this program with and without +RTS -qm
?
According to the documentation, -qm
disables the thread migration, which I think it has a similar effect of using only forkOn
. Am I correct in this assumption? I'm sure not how clear the documentation is in this regard.
I'm no expert on the subject, but I'll give it a shot anyway.
GHC (The Haskell compiler) can have one or multiple HECs (Haskell Execution Context, also known as cap or capability). With runtime flag +RTS -N <number>
or setNumCapabilities
function it's possible to define how many those HECs are available for program. One HEC is one operating system thread. The runtime scheduler distributes Haskell lightweight threads between HECs.
With forkOn
function, it's possible to select which HEC the thread is ran on. getNumCapabilities
returns the number of capabilities (HECs).
Thread migration means that Haskell threads can be migrated (moved) to another HEC. The runtime flag +RTS -qm
disables this thread migration.
Documentation about forkOn
states that
Like forkIO, but lets you specify on which capability the thread should run. Unlike a forkIO thread, a thread created by forkOn will stay on the same capability for its entire lifetime (forkIO threads can migrate between capabilities according to the scheduling policy).
so with forkOn
it's possible to select one single HEC the thread is ran in.
Compared to forkIO
which states that
Foreign calls made by this thread are not guaranteed to be made by any particular OS thread; if you need foreign calls to be made by a particular OS thread, then use forkOS instead.
Now, are forkOn
function and +RTS -qm
(disabled thread migration) the same thing? Probably not. With forkOn
user explicitly selects which HEC the Haskell thread is ran on (for example it's possible to put all Haskell threads into same HEC). With +RTS -qm
and forkIO
the Haskell threads don't switch between HECs, but there's no way knowing which HEC the Haskell thread spawned by forkIO
ends in.
References:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With