summaryrefslogtreecommitdiff
path: root/docs/users_guide/runtime_control.xml
diff options
context:
space:
mode:
Diffstat (limited to 'docs/users_guide/runtime_control.xml')
-rw-r--r--docs/users_guide/runtime_control.xml1605
1 files changed, 0 insertions, 1605 deletions
diff --git a/docs/users_guide/runtime_control.xml b/docs/users_guide/runtime_control.xml
deleted file mode 100644
index b23f79fabf..0000000000
--- a/docs/users_guide/runtime_control.xml
+++ /dev/null
@@ -1,1605 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<sect1 id="runtime-control">
- <title>Running a compiled program</title>
-
- <indexterm><primary>runtime control of Haskell programs</primary></indexterm>
- <indexterm><primary>running, compiled program</primary></indexterm>
- <indexterm><primary>RTS options</primary></indexterm>
-
- <para>To make an executable program, the GHC system compiles your
- code and then links it with a non-trivial runtime system (RTS),
- which handles storage management, thread scheduling, profiling, and
- so on.</para>
-
- <para>
- The RTS has a lot of options to control its behaviour. For
- example, you can change the context-switch interval, the default
- size of the heap, and enable heap profiling. These options can be
- passed to the runtime system in a variety of different ways; the
- next section (<xref linkend="setting-rts-options" />) describes
- the various methods, and the following sections describe the RTS
- options themselves.
- </para>
-
- <sect2 id="setting-rts-options">
- <title>Setting RTS options</title>
- <indexterm><primary>RTS options, setting</primary></indexterm>
-
- <para>
- There are four ways to set RTS options:
-
- <itemizedlist>
- <listitem>
- <para>
- on the command line between <literal>+RTS ... -RTS</literal>, when running the program
- (<xref linkend="rts-opts-cmdline" />)
- </para>
- </listitem>
- <listitem>
- <para>at compile-time, using <option>--with-rtsopts</option>
- (<xref linkend="rts-opts-compile-time" />)
- </para>
- </listitem>
- <listitem>
- <para>with the environment variable <envar>GHCRTS</envar>
- (<xref linkend="rts-options-environment" />)
- </para>
- </listitem>
- <listitem>
- <para>by overriding &ldquo;hooks&rdquo; in the runtime system
- (<xref linkend="rts-hooks" />)
- </para>
- </listitem>
- </itemizedlist>
- </para>
-
- <sect3 id="rts-opts-cmdline">
- <title>Setting RTS options on the command line</title>
-
- <para>
- If you set the <literal>-rtsopts</literal> flag appropriately
- when linking (see <xref linkend="options-linker" />), you can
- give RTS options on the command line when running your
- program.
- </para>
-
- <para>
- When your Haskell program starts up, the RTS extracts
- command-line arguments bracketed between
- <option>+RTS</option><indexterm><primary><option>+RTS</option></primary></indexterm>
- and
- <option>-RTS</option><indexterm><primary><option>-RTS</option></primary></indexterm>
- as its own. For example:
- </para>
-
-<screen>
-$ ghc prog.hs -rtsopts
-[1 of 1] Compiling Main ( prog.hs, prog.o )
-Linking prog ...
-$ ./prog -f +RTS -H32m -S -RTS -h foo bar
-</screen>
-
- <para>
- The RTS will
- snaffle <option>-H32m</option> <option>-S</option> for itself,
- and the remaining arguments <literal>-f -h foo bar</literal>
- will be available to your program if/when it calls
- <function>System.Environment.getArgs</function>.
- </para>
-
- <para>
- No <option>-RTS</option> option is required if the
- runtime-system options extend to the end of the command line, as in
- this example:
- </para>
-
-<screen>
-% hls -ltr /usr/etc +RTS -A5m
-</screen>
-
- <para>
- If you absolutely positively want all the rest of the options
- in a command line to go to the program (and not the RTS), use a
- <option>--RTS</option><indexterm><primary><option>--RTS</option></primary></indexterm>.
- </para>
-
- <para>
- As always, for RTS options that take
- <replaceable>size</replaceable>s: If the last character of
- <replaceable>size</replaceable> is a K or k, multiply by 1000; if an
- M or m, by 1,000,000; if a G or G, by 1,000,000,000. (And any
- wraparound in the counters is <emphasis>your</emphasis>
- fault!)
- </para>
-
- <para>
- Giving a <literal>+RTS -?</literal>
- <indexterm><primary><option>-?</option></primary><secondary>RTS option</secondary></indexterm> option
- will print out the RTS options actually available in your program
- (which vary, depending on how you compiled).</para>
-
- <para>
- NOTE: since GHC is itself compiled by GHC, you can change RTS
- options in the compiler using the normal
- <literal>+RTS ... -RTS</literal>
- combination. eg. to set the maximum heap
- size for a compilation to 128M, you would add
- <literal>+RTS -M128m -RTS</literal>
- to the command line.
- </para>
- </sect3>
-
- <sect3 id="rts-opts-compile-time">
- <title>Setting RTS options at compile time</title>
-
- <para>
- GHC lets you change the default RTS options for a program at
- compile time, using the <literal>-with-rtsopts</literal>
- flag (<xref linkend="options-linker" />). A common use for this is
- to give your program a default heap and/or stack size that is
- greater than the default. For example, to set <literal>-H128m
- -K64m</literal>, link
- with <literal>-with-rtsopts="-H128m -K64m"</literal>.
- </para>
- </sect3>
-
- <sect3 id="rts-options-environment">
- <title>Setting RTS options with the <envar>GHCRTS</envar>
- environment variable</title>
-
- <indexterm><primary>RTS options</primary><secondary>from the environment</secondary></indexterm>
- <indexterm><primary>environment variable</primary><secondary>for
- setting RTS options</secondary></indexterm>
-
- <para>
- If the <literal>-rtsopts</literal> flag is set to
- something other than <literal>none</literal> when linking,
- RTS options are also taken from the environment variable
- <envar>GHCRTS</envar><indexterm><primary><envar>GHCRTS</envar></primary>
- </indexterm>. For example, to set the maximum heap size
- to 2G for all GHC-compiled programs (using an
- <literal>sh</literal>-like shell):
- </para>
-
-<screen>
- GHCRTS='-M2G'
- export GHCRTS
-</screen>
-
- <para>
- RTS options taken from the <envar>GHCRTS</envar> environment
- variable can be overridden by options given on the command
- line.
- </para>
-
- <para>
- Tip: setting something like <literal>GHCRTS=-M2G</literal>
- in your environment is a handy way to avoid Haskell programs
- growing beyond the real memory in your machine, which is
- easy to do by accident and can cause the machine to slow to
- a crawl until the OS decides to kill the process (and you
- hope it kills the right one).
- </para>
- </sect3>
-
- <sect3 id="rts-hooks">
- <title>&ldquo;Hooks&rdquo; to change RTS behaviour</title>
-
- <indexterm><primary>hooks</primary><secondary>RTS</secondary></indexterm>
- <indexterm><primary>RTS hooks</primary></indexterm>
- <indexterm><primary>RTS behaviour, changing</primary></indexterm>
-
- <para>GHC lets you exercise rudimentary control over certain RTS
- settings for any given program, by compiling in a
- &ldquo;hook&rdquo; that is called by the run-time system. The RTS
- contains stub definitions for these hooks, but by writing your
- own version and linking it on the GHC command line, you can
- override the defaults.</para>
-
- <para>Owing to the vagaries of DLL linking, these hooks don't work
- under Windows when the program is built dynamically.</para>
-
- <para>You can change the messages printed when the runtime
- system &ldquo;blows up,&rdquo; e.g., on stack overflow. The hooks
- for these are as follows:</para>
-
- <variablelist>
-
- <varlistentry>
- <term>
- <function>void OutOfHeapHook (unsigned long, unsigned long)</function>
- <indexterm><primary><function>OutOfHeapHook</function></primary></indexterm>
- </term>
- <listitem>
- <para>The heap-overflow message.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <function>void StackOverflowHook (long int)</function>
- <indexterm><primary><function>StackOverflowHook</function></primary></indexterm>
- </term>
- <listitem>
- <para>The stack-overflow message.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <function>void MallocFailHook (long int)</function>
- <indexterm><primary><function>MallocFailHook</function></primary></indexterm>
- </term>
- <listitem>
- <para>The message printed if <function>malloc</function>
- fails.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect3>
-
- </sect2>
-
- <sect2 id="rts-options-misc">
- <title>Miscellaneous RTS options</title>
-
- <variablelist>
- <varlistentry>
- <term><option>-V<replaceable>secs</replaceable></option>
- <indexterm><primary><option>-V</option></primary><secondary>RTS
- option</secondary></indexterm></term>
- <listitem>
- <para>Sets the interval that the RTS clock ticks at. The
- runtime uses a single timer signal to count ticks; this timer
- signal is used to control the context switch timer (<xref
- linkend="using-concurrent" />) and the heap profiling
- timer <xref linkend="rts-options-heap-prof" />. Also, the
- time profiler uses the RTS timer signal directly to record
- time profiling samples.</para>
-
- <para>Normally, setting the <option>-V</option> option
- directly is not necessary: the resolution of the RTS timer is
- adjusted automatically if a short interval is requested with
- the <option>-C</option> or <option>-i</option> options.
- However, setting <option>-V</option> is required in order to
- increase the resolution of the time profiler.</para>
-
- <para>Using a value of zero disables the RTS clock
- completely, and has the effect of disabling timers that
- depend on it: the context switch timer and the heap profiling
- timer. Context switches will still happen, but
- deterministically and at a rate much faster than normal.
- Disabling the interval timer is useful for debugging, because
- it eliminates a source of non-determinism at runtime.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>--install-signal-handlers=<replaceable>yes|no</replaceable></option>
- <indexterm><primary><option>--install-signal-handlers</option></primary><secondary>RTS
- option</secondary></indexterm></term>
- <listitem>
- <para>If yes (the default), the RTS installs signal handlers to catch
- things like ctrl-C. This option is primarily useful for when
- you are using the Haskell code as a DLL, and want to set your
- own signal handlers.</para>
-
- <para>Note that even
- with <option>--install-signal-handlers=no</option>, the RTS
- interval timer signal is still enabled. The timer signal
- is either SIGVTALRM or SIGALRM, depending on the RTS
- configuration and OS capabilities. To disable the timer
- signal, use the <literal>-V0</literal> RTS option (see
- above).
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-xm<replaceable>address</replaceable></option>
- <indexterm><primary><option>-xm</option></primary><secondary>RTS
- option</secondary></indexterm></term>
- <listitem>
- <para>
- WARNING: this option is for working around memory
- allocation problems only. Do not use unless GHCi fails
- with a message like &ldquo;<literal>failed to mmap() memory below 2Gb</literal>&rdquo;. If you need to use this option to get GHCi working
- on your machine, please file a bug.
- </para>
-
- <para>
- On 64-bit machines, the RTS needs to allocate memory in the
- low 2Gb of the address space. Support for this across
- different operating systems is patchy, and sometimes fails.
- This option is there to give the RTS a hint about where it
- should be able to allocate memory in the low 2Gb of the
- address space. For example, <literal>+RTS -xm20000000
- -RTS</literal> would hint that the RTS should allocate
- starting at the 0.5Gb mark. The default is to use the OS's
- built-in support for allocating memory in the low 2Gb if
- available (e.g. <literal>mmap</literal>
- with <literal>MAP_32BIT</literal> on Linux), or
- otherwise <literal>-xm40000000</literal>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-xq<replaceable>size</replaceable></option>
- <indexterm><primary><option>-xq</option></primary><secondary>RTS
- option</secondary></indexterm></term>
- <listitem>
- <para>
- &lsqb;Default: 100k&rsqb; This option relates to allocation
- limits; for more about this see <ulink
- url="&libraryBaseLocation;/GHC-Conc.html#v%3AenableAllocationLimit"><literal>enableAllocationLimit</literal></ulink>.
- When a thread hits its allocation limit, the RTS throws an
- exception to the thread, and the thread gets an additional
- quota of allocation before the exception is raised again,
- the idea being so that the thread can execute its exception
- handlers. The <option>-xq</option> controls the size of
- this additional quota.
- </para>
- </listitem>
- </varlistentry>
-
- </variablelist>
- </sect2>
-
- <sect2 id="rts-options-gc">
- <title>RTS options to control the garbage collector</title>
-
- <indexterm><primary>garbage collector</primary><secondary>options</secondary></indexterm>
- <indexterm><primary>RTS options</primary><secondary>garbage collection</secondary></indexterm>
-
- <para>There are several options to give you precise control over
- garbage collection. Hopefully, you won't need any of these in
- normal operation, but there are several things that can be tweaked
- for maximum performance.</para>
-
- <variablelist>
-
- <varlistentry>
- <term>
- <option>-A</option><replaceable>size</replaceable>
- <indexterm><primary><option>-A</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>allocation area, size</primary></indexterm>
- </term>
- <listitem>
- <para>&lsqb;Default: 512k&rsqb; Set the allocation area size
- used by the garbage collector. The allocation area
- (actually generation 0 step 0) is fixed and is never resized
- (unless you use <option>-H</option>, below).</para>
-
- <para>Increasing the allocation area size may or may not
- give better performance (a bigger allocation area means
- worse cache behaviour but fewer garbage collections and less
- promotion).</para>
-
- <para>With only 1 generation (<option>-G1</option>) the
- <option>-A</option> option specifies the minimum allocation
- area, since the actual size of the allocation area will be
- resized according to the amount of data in the heap (see
- <option>-F</option>, below).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-O</option><replaceable>size</replaceable>
- <indexterm><primary><option>-O</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>old generation, size</primary></indexterm>
- </term>
- <listitem>
- <para>&lsqb;Default: 1m&rsqb; Set the minimum size of the
- old generation. The old generation is collected whenever it
- grows to this size or the value of the <option>-F</option> option
- multiplied by the size of the live data at the previous major
- collection, whichever is larger.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-n</option><replaceable>size</replaceable>
- <indexterm><primary><option>-n</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>allocation area, chunk size</primary></indexterm>
- </term>
- <listitem>
- <para>&lsqb;Default: 0, Example:
- <literal>-n4m</literal>&rsqb; When set to a non-zero value,
- this option divides the allocation area (<option>-A</option>
- value) into chunks of the specified size. During execution,
- when a processor exhausts its current chunk, it is given
- another chunk from the pool until the pool is exhausted, at
- which point a collection is triggered.</para>
-
- <para>This option is only useful when running in parallel
- (<option>-N2</option> or greater). It allows the processor
- cores to make better use of the available allocation area,
- even when cores are allocating at different rates. Without
- <option>-n</option>, each core gets a fixed-size allocation
- area specified by the <option>-A</option>, and the first
- core to exhaust its allocation area triggers a GC across all
- the cores. This can result in a collection happening when
- the allocation areas of some cores are only partially full,
- so the purpose of the <option>-n</option> is to allow cores
- that are allocating faster to get more of the allocation
- area. This means less frequent GC, leading a lower GC
- overhead for the same heap size.</para>
-
- <para>This is particularly useful in conjunction with larger
- <option>-A</option> values, for example <option>-A64m
- -n4m</option> is a useful combination on larger core counts
- (8+).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-c</option>
- <indexterm><primary><option>-c</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>garbage collection</primary><secondary>compacting</secondary></indexterm>
- <indexterm><primary>compacting garbage collection</primary></indexterm>
- </term>
- <listitem>
- <para>Use a compacting algorithm for collecting the oldest
- generation. By default, the oldest generation is collected
- using a copying algorithm; this option causes it to be
- compacted in-place instead. The compaction algorithm is
- slower than the copying algorithm, but the savings in memory
- use can be considerable.</para>
-
- <para>For a given heap size (using the <option>-H</option>
- option), compaction can in fact reduce the GC cost by
- allowing fewer GCs to be performed. This is more likely
- when the ratio of live data to heap size is high, say
- &gt;30&percnt;.</para>
-
- <para>NOTE: compaction doesn't currently work when a single
- generation is requested using the <option>-G1</option>
- option.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-c</option><replaceable>n</replaceable></term>
-
- <listitem>
- <para>&lsqb;Default: 30&rsqb; Automatically enable
- compacting collection when the live data exceeds
- <replaceable>n</replaceable>&percnt; of the maximum heap size
- (see the <option>-M</option> option). Note that the maximum
- heap size is unlimited by default, so this option has no
- effect unless the maximum heap size is set with
- <option>-M</option><replaceable>size</replaceable>. </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-F</option><replaceable>factor</replaceable>
- <indexterm><primary><option>-F</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>heap size, factor</primary></indexterm>
- </term>
- <listitem>
-
- <para>&lsqb;Default: 2&rsqb; This option controls the amount
- of memory reserved for the older generations (and in the
- case of a two space collector the size of the allocation
- area) as a factor of the amount of live data. For example,
- if there was 2M of live data in the oldest generation when
- we last collected it, then by default we'll wait until it
- grows to 4M before collecting it again.</para>
-
- <para>The default seems to work well here. If you have
- plenty of memory, it is usually better to use
- <option>-H</option><replaceable>size</replaceable> than to
- increase
- <option>-F</option><replaceable>factor</replaceable>.</para>
-
- <para>The <option>-F</option> setting will be automatically
- reduced by the garbage collector when the maximum heap size
- (the <option>-M</option><replaceable>size</replaceable>
- setting) is approaching.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-G</option><replaceable>generations</replaceable>
- <indexterm><primary><option>-G</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>generations, number of</primary></indexterm>
- </term>
- <listitem>
- <para>&lsqb;Default: 2&rsqb; Set the number of generations
- used by the garbage collector. The default of 2 seems to be
- good, but the garbage collector can support any number of
- generations. Anything larger than about 4 is probably not a
- good idea unless your program runs for a
- <emphasis>long</emphasis> time, because the oldest
- generation will hardly ever get collected.</para>
-
- <para>Specifying 1 generation with <option>+RTS -G1</option>
- gives you a simple 2-space collector, as you would expect.
- In a 2-space collector, the <option>-A</option> option (see
- above) specifies the <emphasis>minimum</emphasis> allocation
- area size, since the allocation area will grow with the
- amount of live data in the heap. In a multi-generational
- collector the allocation area is a fixed size (unless you
- use the <option>-H</option> option, see below).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-qg<optional><replaceable>gen</replaceable></optional></option>
- <indexterm><primary><option>-qg</option><secondary>RTS
- option</secondary></primary></indexterm>
- </term>
- <listitem>
- <para>&lsqb;New in GHC 6.12.1&rsqb; &lsqb;Default: 0&rsqb;
- Use parallel GC in
- generation <replaceable>gen</replaceable> and higher.
- Omitting <replaceable>gen</replaceable> turns off the
- parallel GC completely, reverting to sequential GC.</para>
-
- <para>The default parallel GC settings are usually suitable
- for parallel programs (i.e. those
- using <literal>par</literal>, Strategies, or with multiple
- threads). However, it is sometimes beneficial to enable
- the parallel GC for a single-threaded sequential program
- too, especially if the program has a large amount of heap
- data and GC is a significant fraction of runtime. To use
- the parallel GC in a sequential program, enable the
- parallel runtime with a suitable <literal>-N</literal>
- option, and additionally it might be beneficial to
- restrict parallel GC to the old generation
- with <literal>-qg1</literal>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-qb<optional><replaceable>gen</replaceable></optional></option>
- <indexterm><primary><option>-qb</option><secondary>RTS
- option</secondary></primary></indexterm>
- </term>
- <listitem>
- <para>
- &lsqb;New in GHC 6.12.1&rsqb; &lsqb;Default: 1&rsqb; Use
- load-balancing in the parallel GC in
- generation <replaceable>gen</replaceable> and higher.
- Omitting <replaceable>gen</replaceable> disables
- load-balancing entirely.</para>
-
- <para>
- Load-balancing shares out the work of GC between the
- available cores. This is a good idea when the heap is
- large and we need to parallelise the GC work, however it
- is also pessimal for the short young-generation
- collections in a parallel program, because it can harm
- locality by moving data from the cache of the CPU where is
- it being used to the cache of another CPU. Hence the
- default is to do load-balancing only in the
- old-generation. In fact, for a parallel program it is
- sometimes beneficial to disable load-balancing entirely
- with <literal>-qb</literal>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-H</option><optional><replaceable>size</replaceable></optional>
- <indexterm><primary><option>-H</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>heap size, suggested</primary></indexterm>
- </term>
- <listitem>
- <para>&lsqb;Default: 0&rsqb; This option provides a
- &ldquo;suggested heap size&rdquo; for the garbage
- collector. Think
- of <option>-H<replaceable>size</replaceable></option> as a
- variable <option>-A</option> option. It says: I want to
- use at least <replaceable>size</replaceable> bytes, so use
- whatever is left over to increase the <option>-A</option>
- value.</para>
-
- <para>This option does not put
- a <emphasis>limit</emphasis> on the heap size: the heap
- may grow beyond the given size as usual.</para>
-
- <para>If <replaceable>size</replaceable> is omitted, then
- the garbage collector will take the size of the heap at
- the previous GC as the <replaceable>size</replaceable>.
- This has the effect of allowing for a
- larger <option>-A</option> value but without increasing
- the overall memory requirements of the program. It can be
- useful when the default small <option>-A</option> value is
- suboptimal, as it can be in programs that create large
- amounts of long-lived data.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-I</option><replaceable>seconds</replaceable>
- <indexterm><primary><option>-I</option></primary>
- <secondary>RTS option</secondary>
- </indexterm>
- <indexterm><primary>idle GC</primary>
- </indexterm>
- </term>
- <listitem>
- <para>(default: 0.3) In the threaded and SMP versions of the RTS (see
- <option>-threaded</option>, <xref linkend="options-linker" />), a
- major GC is automatically performed if the runtime has been idle
- (no Haskell computation has been running) for a period of time.
- The amount of idle time which must pass before a GC is performed is
- set by the <option>-I</option><replaceable>seconds</replaceable>
- option. Specifying <option>-I0</option> disables the idle GC.</para>
-
- <para>For an interactive application, it is probably a good idea to
- use the idle GC, because this will allow finalizers to run and
- deadlocked threads to be detected in the idle time when no Haskell
- computation is happening. Also, it will mean that a GC is less
- likely to happen when the application is busy, and so
- responsiveness may be improved. However, if the amount of live data in
- the heap is particularly large, then the idle GC can cause a
- significant delay, and too small an interval could adversely affect
- interactive responsiveness.</para>
-
- <para>This is an experimental feature, please let us know if it
- causes problems and/or could benefit from further tuning.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-ki</option><replaceable>size</replaceable>
- <indexterm><primary><option>-k</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>stack, initial size</primary></indexterm>
- </term>
- <listitem>
- <para>
- &lsqb;Default: 1k&rsqb; Set the initial stack size for new
- threads. (Note: this flag used to be
- simply <option>-k</option>, but was renamed
- to <option>-ki</option> in GHC 7.2.1. The old name is
- still accepted for backwards compatibility, but that may
- be removed in a future version).
- </para>
-
- <para>
- Thread stacks (including the main thread's stack) live on
- the heap. As the stack grows, new stack chunks are added
- as required; if the stack shrinks again, these extra stack
- chunks are reclaimed by the garbage collector. The
- default initial stack size is deliberately small, in order
- to keep the time and space overhead for thread creation to
- a minimum, and to make it practical to spawn threads for
- even tiny pieces of work.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-kc</option><replaceable>size</replaceable>
- <indexterm><primary><option>-kc</option></primary><secondary>RTS
- option</secondary></indexterm>
- <indexterm><primary>stack</primary><secondary>chunk size</secondary></indexterm>
- </term>
- <listitem>
- <para>
- &lsqb;Default: 32k&rsqb; Set the size of &ldquo;stack
- chunks&rdquo;. When a thread's current stack overflows, a
- new stack chunk is created and added to the thread's
- stack, until the limit set by <option>-K</option> is
- reached.
- </para>
-
- <para>
- The advantage of smaller stack chunks is that the garbage
- collector can avoid traversing stack chunks if they are
- known to be unmodified since the last collection, so
- reducing the chunk size means that the garbage collector
- can identify more stack as unmodified, and the GC overhead
- might be reduced. On the other hand, making stack chunks
- too small adds some overhead as there will be more
- overflow/underflow between chunks. The default setting of
- 32k appears to be a reasonable compromise in most cases.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-kb</option><replaceable>size</replaceable>
- <indexterm><primary><option>-kc</option></primary><secondary>RTS
- option</secondary></indexterm>
- <indexterm><primary>stack</primary><secondary>chunk buffer size</secondary></indexterm>
- </term>
- <listitem>
- <para>
- &lsqb;Default: 1k&rsqb; Sets the stack chunk buffer size.
- When a stack chunk overflows and a new stack chunk is
- created, some of the data from the previous stack chunk is
- moved into the new chunk, to avoid an immediate underflow
- and repeated overflow/underflow at the boundary. The
- amount of stack moved is set by the <option>-kb</option>
- option.
- </para>
- <para>
- Note that to avoid wasting space, this value should
- typically be less than 10&percnt; of the size of a stack
- chunk (<option>-kc</option>), because in a chain of stack
- chunks, each chunk will have a gap of unused space of this
- size.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-K</option><replaceable>size</replaceable>
- <indexterm><primary><option>-K</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>stack, maximum size</primary></indexterm>
- </term>
- <listitem>
- <para>&lsqb;Default: 80% physical memory size&rsqb; Set the
- maximum stack size for an individual thread to
- <replaceable>size</replaceable> bytes. If the thread
- attempts to exceed this limit, it will be sent the
- <literal>StackOverflow</literal> exception. The
- limit can be disabled entirely by specifying a size of zero.
- </para>
- <para>
- This option is there mainly to stop the program eating up
- all the available memory in the machine if it gets into an
- infinite loop.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-m</option><replaceable>n</replaceable>
- <indexterm><primary><option>-m</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>heap, minimum free</primary></indexterm>
- </term>
- <listitem>
- <para>Minimum &percnt; <replaceable>n</replaceable> of heap
- which must be available for allocation. The default is
- 3&percnt;.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-M</option><replaceable>size</replaceable>
- <indexterm><primary><option>-M</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>heap size, maximum</primary></indexterm>
- </term>
- <listitem>
- <para>&lsqb;Default: unlimited&rsqb; Set the maximum heap size to
- <replaceable>size</replaceable> bytes. The heap normally
- grows and shrinks according to the memory requirements of
- the program. The only reason for having this option is to
- stop the heap growing without bound and filling up all the
- available swap space, which at the least will result in the
- program being summarily killed by the operating
- system.</para>
-
- <para>The maximum heap size also affects other garbage
- collection parameters: when the amount of live data in the
- heap exceeds a certain fraction of the maximum heap size,
- compacting collection will be automatically enabled for the
- oldest generation, and the <option>-F</option> parameter
- will be reduced in order to avoid exceeding the maximum heap
- size.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-T</option>
- <indexterm><primary><option>-T</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <term>
- <option>-t</option><optional><replaceable>file</replaceable></optional>
- <indexterm><primary><option>-t</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <term>
- <option>-s</option><optional><replaceable>file</replaceable></optional>
- <indexterm><primary><option>-s</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <term>
- <option>-S</option><optional><replaceable>file</replaceable></optional>
- <indexterm><primary><option>-S</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <term>
- <option>--machine-readable</option>
- <indexterm><primary><option>--machine-readable</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <listitem>
- <para>These options produce runtime-system statistics, such
- as the amount of time spent executing the program and in the
- garbage collector, the amount of memory allocated, the
- maximum size of the heap, and so on. The three
- variants give different levels of detail:
- <option>-T</option> collects the data but produces no output
- <option>-t</option> produces a single line of output in the
- same format as GHC's <option>-Rghc-timing</option> option,
- <option>-s</option> produces a more detailed summary at the
- end of the program, and <option>-S</option> additionally
- produces information about each and every garbage
- collection.</para>
-
- <para>The output is placed in
- <replaceable>file</replaceable>. If
- <replaceable>file</replaceable> is omitted, then the output
- is sent to <constant>stderr</constant>.</para>
-
- <para>
- If you use the <literal>-T</literal> flag then, you should
- access the statistics using
- <ulink url="&libraryBaseLocation;/GHC-Stats.html">GHC.Stats</ulink>.
- </para>
-
- <para>
- If you use the <literal>-t</literal> flag then, when your
- program finishes, you will see something like this:
- </para>
-
-<programlisting>
-&lt;&lt;ghc: 36169392 bytes, 69 GCs, 603392/1065272 avg/max bytes residency (2 samples), 3M in use, 0.00 INIT (0.00 elapsed), 0.02 MUT (0.02 elapsed), 0.07 GC (0.07 elapsed) :ghc&gt;&gt;
-</programlisting>
-
- <para>
- This tells you:
- </para>
-
- <itemizedlist>
- <listitem>
- <para>
- The total number of bytes allocated by the program over the
- whole run.
- </para>
- </listitem>
- <listitem>
- <para>
- The total number of garbage collections performed.
- </para>
- </listitem>
- <listitem>
- <para>
- The average and maximum "residency", which is the amount of
- live data in bytes. The runtime can only determine the
- amount of live data during a major GC, which is why the
- number of samples corresponds to the number of major GCs
- (and is usually relatively small). To get a better picture
- of the heap profile of your program, use
- the <option>-hT</option> RTS option
- (<xref linkend="rts-profiling" />).
- </para>
- </listitem>
- <listitem>
- <para>
- The peak memory the RTS has allocated from the OS.
- </para>
- </listitem>
- <listitem>
- <para>
- The amount of CPU time and elapsed wall clock time while
- initialising the runtime system (INIT), running the program
- itself (MUT, the mutator), and garbage collecting (GC).
- </para>
- </listitem>
- </itemizedlist>
-
- <para>
- You can also get this in a more future-proof, machine readable
- format, with <literal>-t --machine-readable</literal>:
- </para>
-
-<programlisting>
- [("bytes allocated", "36169392")
- ,("num_GCs", "69")
- ,("average_bytes_used", "603392")
- ,("max_bytes_used", "1065272")
- ,("num_byte_usage_samples", "2")
- ,("peak_megabytes_allocated", "3")
- ,("init_cpu_seconds", "0.00")
- ,("init_wall_seconds", "0.00")
- ,("mutator_cpu_seconds", "0.02")
- ,("mutator_wall_seconds", "0.02")
- ,("GC_cpu_seconds", "0.07")
- ,("GC_wall_seconds", "0.07")
- ]
-</programlisting>
-
- <para>
- If you use the <literal>-s</literal> flag then, when your
- program finishes, you will see something like this (the exact
- details will vary depending on what sort of RTS you have, e.g.
- you will only see profiling data if your RTS is compiled for
- profiling):
- </para>
-
-<programlisting>
- 36,169,392 bytes allocated in the heap
- 4,057,632 bytes copied during GC
- 1,065,272 bytes maximum residency (2 sample(s))
- 54,312 bytes maximum slop
- 3 MB total memory in use (0 MB lost due to fragmentation)
-
- Generation 0: 67 collections, 0 parallel, 0.04s, 0.03s elapsed
- Generation 1: 2 collections, 0 parallel, 0.03s, 0.04s elapsed
-
- SPARKS: 359207 (557 converted, 149591 pruned)
-
- INIT time 0.00s ( 0.00s elapsed)
- MUT time 0.01s ( 0.02s elapsed)
- GC time 0.07s ( 0.07s elapsed)
- EXIT time 0.00s ( 0.00s elapsed)
- Total time 0.08s ( 0.09s elapsed)
-
- %GC time 89.5% (75.3% elapsed)
-
- Alloc rate 4,520,608,923 bytes per MUT second
-
- Productivity 10.5% of total user, 9.1% of total elapsed
-</programlisting>
-
- <itemizedlist>
- <listitem>
- <para>
- The "bytes allocated in the heap" is the total bytes allocated
- by the program over the whole run.
- </para>
- </listitem>
- <listitem>
- <para>
- GHC uses a copying garbage collector by default. "bytes copied
- during GC" tells you how many bytes it had to copy during
- garbage collection.
- </para>
- </listitem>
- <listitem>
- <para>
- The maximum space actually used by your program is the
- "bytes maximum residency" figure. This is only checked during
- major garbage collections, so it is only an approximation;
- the number of samples tells you how many times it is checked.
- </para>
- </listitem>
- <listitem>
- <para>
- The "bytes maximum slop" tells you the most space that is ever
- wasted due to the way GHC allocates memory in blocks. Slop is
- memory at the end of a block that was wasted. There's no way
- to control this; we just like to see how much memory is being
- lost this way.
- </para>
- </listitem>
- <listitem>
- <para>
- The "total memory in use" tells you the peak memory the RTS has
- allocated from the OS.
- </para>
- </listitem>
- <listitem>
- <para>
- Next there is information about the garbage collections done.
- For each generation it says how many garbage collections were
- done, how many of those collections were done in parallel,
- the total CPU time used for garbage collecting that generation,
- and the total wall clock time elapsed while garbage collecting
- that generation.
- </para>
- </listitem>
- <listitem>
- <para>The <literal>SPARKS</literal> statistic refers to the
- use of <literal>Control.Parallel.par</literal> and related
- functionality in the program. Each spark represents a call
- to <literal>par</literal>; a spark is "converted" when it is
- executed in parallel; and a spark is "pruned" when it is
- found to be already evaluated and is discarded from the pool
- by the garbage collector. Any remaining sparks are
- discarded at the end of execution, so "converted" plus
- "pruned" does not necessarily add up to the total.</para>
- </listitem>
- <listitem>
- <para>
- Next there is the CPU time and wall clock time elapsed broken
- down by what the runtime system was doing at the time.
- INIT is the runtime system initialisation.
- MUT is the mutator time, i.e. the time spent actually running
- your code.
- GC is the time spent doing garbage collection.
- RP is the time spent doing retainer profiling.
- PROF is the time spent doing other profiling.
- EXIT is the runtime system shutdown time.
- And finally, Total is, of course, the total.
- </para>
- <para>
- %GC time tells you what percentage GC is of Total.
- "Alloc rate" tells you the "bytes allocated in the heap" divided
- by the MUT CPU time.
- "Productivity" tells you what percentage of the Total CPU and wall
- clock elapsed times are spent in the mutator (MUT).
- </para>
- </listitem>
- </itemizedlist>
-
- <para>
- The <literal>-S</literal> flag, as well as giving the same
- output as the <literal>-s</literal> flag, prints information
- about each GC as it happens:
- </para>
-
-<programlisting>
- Alloc Copied Live GC GC TOT TOT Page Flts
- bytes bytes bytes user elap user elap
- 528496 47728 141512 0.01 0.02 0.02 0.02 0 0 (Gen: 1)
-[...]
- 524944 175944 1726384 0.00 0.00 0.08 0.11 0 0 (Gen: 0)
-</programlisting>
-
- <para>
- For each garbage collection, we print:
- </para>
-
- <itemizedlist>
- <listitem>
- <para>
- How many bytes we allocated this garbage collection.
- </para>
- </listitem>
- <listitem>
- <para>
- How many bytes we copied this garbage collection.
- </para>
- </listitem>
- <listitem>
- <para>
- How many bytes are currently live.
- </para>
- </listitem>
- <listitem>
- <para>
- How long this garbage collection took (CPU time and elapsed
- wall clock time).
- </para>
- </listitem>
- <listitem>
- <para>
- How long the program has been running (CPU time and elapsed
- wall clock time).
- </para>
- </listitem>
- <listitem>
- <para>
- How many page faults occurred this garbage collection.
- </para>
- </listitem>
- <listitem>
- <para>
- How many page faults occurred since the end of the last garbage
- collection.
- </para>
- </listitem>
- <listitem>
- <para>
- Which generation is being garbage collected.
- </para>
- </listitem>
- </itemizedlist>
-
- </listitem>
- </varlistentry>
- </variablelist>
-
- </sect2>
-
- <sect2>
- <title>RTS options for concurrency and parallelism</title>
-
- <para>The RTS options related to concurrency are described in
- <xref linkend="using-concurrent" />, and those for parallelism in
- <xref linkend="parallel-options"/>.</para>
- </sect2>
-
- <sect2 id="rts-profiling">
- <title>RTS options for profiling</title>
-
- <para>Most profiling runtime options are only available when you
- compile your program for profiling (see
- <xref linkend="prof-compiler-options" />, and
- <xref linkend="rts-options-heap-prof" /> for the runtime options).
- However, there is one profiling option that is available
- for ordinary non-profiled executables:</para>
-
- <variablelist>
- <varlistentry>
- <term>
- <option>-hT</option>
- <indexterm><primary><option>-hT</option></primary><secondary>RTS
- option</secondary></indexterm>
- </term>
- <listitem>
- <para>(can be shortened to <option>-h</option>.) Generates a basic heap profile, in the
- file <literal><replaceable>prog</replaceable>.hp</literal>.
- To produce the heap profile graph,
- use <command>hp2ps</command> (see <xref linkend="hp2ps"
- />). The basic heap profile is broken down by data
- constructor, with other types of closures (functions, thunks,
- etc.) grouped into broad categories
- (e.g. <literal>FUN</literal>, <literal>THUNK</literal>). To
- get a more detailed profile, use the full profiling
- support (<xref linkend="profiling" />).</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2 id="rts-eventlog">
- <title>Tracing</title>
-
- <indexterm><primary>tracing</primary></indexterm>
- <indexterm><primary>events</primary></indexterm>
- <indexterm><primary>eventlog files</primary></indexterm>
-
- <para>
- When the program is linked with the <option>-eventlog</option>
- option (<xref linkend="options-linker" />), runtime events can
- be logged in two ways:
- </para>
-
- <itemizedlist>
- <listitem>
- <para>
- In binary format to a file for later analysis by a
- variety of tools. One such tool
- is <ulink url="http://www.haskell.org/haskellwiki/ThreadScope">ThreadScope</ulink><indexterm><primary>ThreadScope</primary></indexterm>,
- which interprets the event log to produce a visual parallel
- execution profile of the program.
- </para>
- </listitem>
- <listitem>
- <para>
- As text to standard output, for debugging purposes.
- </para>
- </listitem>
- </itemizedlist>
-
- <variablelist>
- <varlistentry>
- <term>
- <option>-l<optional><replaceable>flags</replaceable></optional></option>
- <indexterm><primary><option>-l</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <listitem>
- <para>
- Log events in binary format to the
- file <filename><replaceable>program</replaceable>.eventlog</filename>.
- Without any <replaceable>flags</replaceable> specified, this logs a
- default set of events, suitable for use with tools like ThreadScope.
- </para>
-
- <para>
- For some special use cases you may want more control over which
- events are included. The <replaceable>flags</replaceable> is a
- sequence of zero or more characters indicating which classes of
- events to log. Currently these the classes of events that can
- be enabled/disabled:
- <simplelist>
- <member>
- <option>s</option> &#8212; scheduler events, including Haskell
- thread creation and start/stop events. Enabled by default.
- </member>
- <member>
- <option>g</option> &#8212; GC events, including GC start/stop.
- Enabled by default.
- </member>
- <member>
- <option>p</option> &#8212; parallel sparks (sampled).
- Enabled by default.
- </member>
- <member>
- <option>f</option> &#8212; parallel sparks (fully accurate).
- Disabled by default.
- </member>
- <member>
- <option>u</option> &#8212; user events. These are events emitted
- from Haskell code using functions such as
- <literal>Debug.Trace.traceEvent</literal>. Enabled by default.
- </member>
- </simplelist>
- </para>
-
- <para>
- You can disable specific classes, or enable/disable all classes at
- once:
- <simplelist>
- <member>
- <option>a</option> &#8212; enable all event classes listed above
- </member>
- <member>
- <option>-<replaceable>x</replaceable></option> &#8212; disable the
- given class of events, for any event class listed above or
- <option>-a</option> for all classes
- </member>
- </simplelist>
- For example, <option>-l-ag</option> would disable all event classes
- (<option>-a</option>) except for GC events (<option>g</option>).
- </para>
-
- <para>
- For spark events there are two modes: sampled and fully accurate.
- There are various events in the life cycle of each spark, usually
- just creating and running, but there are some more exceptional
- possibilities. In the sampled mode the number of occurrences of each
- kind of spark event is sampled at frequent intervals. In the fully
- accurate mode every spark event is logged individually. The latter
- has a higher runtime overhead and is not enabled by default.
- </para>
-
- <para>
- The format of the log file is described by the header
- <filename>EventLogFormat.h</filename> that comes with
- GHC, and it can be parsed in Haskell using
- the <ulink url="http://hackage.haskell.org/package/ghc-events">ghc-events</ulink>
- library. To dump the contents of
- a <literal>.eventlog</literal> file as text, use the
- tool <literal>ghc-events show</literal> that comes with
- the <ulink url="http://hackage.haskell.org/package/ghc-events">ghc-events</ulink>
- package.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-v</option><optional><replaceable>flags</replaceable></optional>
- <indexterm><primary><option>-v</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <listitem>
- <para>
- Log events as text to standard output, instead of to
- the <literal>.eventlog</literal> file.
- The <replaceable>flags</replaceable> are the same as
- for <option>-l</option>, with the additional
- option <literal>t</literal> which indicates that the
- each event printed should be preceded by a timestamp value
- (in the binary <literal>.eventlog</literal> file, all
- events are automatically associated with a timestamp).
- </para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- <para>
- The debugging
- options <option>-D<replaceable>x</replaceable></option> also
- generate events which are logged using the tracing framework.
- By default those events are dumped as text to stdout
- (<option>-D<replaceable>x</replaceable></option>
- implies <option>-v</option>), but they may instead be stored in
- the binary eventlog file by using the <option>-l</option>
- option.
- </para>
- </sect2>
-
- <sect2 id="rts-options-debugging">
- <title>RTS options for hackers, debuggers, and over-interested
- souls</title>
-
- <indexterm><primary>RTS options, hacking/debugging</primary></indexterm>
-
- <para>These RTS options might be used (a)&nbsp;to avoid a GHC bug,
- (b)&nbsp;to see &ldquo;what's really happening&rdquo;, or
- (c)&nbsp;because you feel like it. Not recommended for everyday
- use!</para>
-
- <variablelist>
-
- <varlistentry>
- <term>
- <option>-B</option>
- <indexterm><primary><option>-B</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <listitem>
- <para>Sound the bell at the start of each (major) garbage
- collection.</para>
-
- <para>Oddly enough, people really do use this option! Our
- pal in Durham (England), Paul Callaghan, writes: &ldquo;Some
- people here use it for a variety of
- purposes&mdash;honestly!&mdash;e.g., confirmation that the
- code/machine is doing something, infinite loop detection,
- gauging cost of recently added code. Certain people can even
- tell what stage &lsqb;the program&rsqb; is in by the beep
- pattern. But the major use is for annoying others in the
- same office&hellip;&rdquo;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-D</option><replaceable>x</replaceable>
- <indexterm><primary>-D</primary><secondary>RTS option</secondary></indexterm>
- </term>
- <listitem>
- <para>
- An RTS debugging flag; only available if the program was
- linked with the <option>-debug</option> option. Various
- values of <replaceable>x</replaceable> are provided to
- enable debug messages and additional runtime sanity checks
- in different subsystems in the RTS, for
- example <literal>+RTS -Ds -RTS</literal> enables debug
- messages from the scheduler.
- Use <literal>+RTS&nbsp;-?</literal> to find out which
- debug flags are supported.
- </para>
-
- <para>
- Debug messages will be sent to the binary event log file
- instead of stdout if the <option>-l</option> option is
- added. This might be useful for reducing the overhead of
- debug tracing.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-r</option><replaceable>file</replaceable>
- <indexterm><primary><option>-r</option></primary><secondary>RTS option</secondary></indexterm>
- <indexterm><primary>ticky ticky profiling</primary></indexterm>
- <indexterm><primary>profiling</primary><secondary>ticky ticky</secondary></indexterm>
- </term>
- <listitem>
- <para>Produce &ldquo;ticky-ticky&rdquo; statistics at the
- end of the program run (only available if the program was
- linked with <option>-debug</option>).
- The <replaceable>file</replaceable> business works just like
- on the <option>-S</option> RTS option, above.</para>
-
- <para>For more information on ticky-ticky profiling, see
- <xref linkend="ticky-ticky"/>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-xc</option>
- <indexterm><primary><option>-xc</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <listitem>
- <para>(Only available when the program is compiled for
- profiling.) When an exception is raised in the program,
- this option causes a stack trace to be
- dumped to <literal>stderr</literal>.</para>
-
- <para>This can be particularly useful for debugging: if your
- program is complaining about a <literal>head []</literal>
- error and you haven't got a clue which bit of code is
- causing it, compiling with <literal>-prof
- -fprof-auto</literal> and running with <literal>+RTS -xc
- -RTS</literal> will tell you exactly the call stack at the
- point the error was raised.</para>
-
- <para>The output contains one report for each exception
- raised in the program (the program might raise and catch
- several exceptions during its execution), where each report
- looks something like this:
- </para>
-
-<screen>
-*** Exception raised (reporting due to +RTS -xc), stack trace:
- GHC.List.CAF
- --> evaluated by: Main.polynomial.table_search,
- called from Main.polynomial.theta_index,
- called from Main.polynomial,
- called from Main.zonal_pressure,
- called from Main.make_pressure.p,
- called from Main.make_pressure,
- called from Main.compute_initial_state.p,
- called from Main.compute_initial_state,
- called from Main.CAF
- ...
-</screen>
- <para>The stack trace may often begin with something
- uninformative like <literal>GHC.List.CAF</literal>; this is
- an artifact of GHC's optimiser, which lifts out exceptions
- to the top-level where the profiling system assigns them to
- the cost centre "CAF". However, <literal>+RTS -xc</literal>
- doesn't just print the current stack, it looks deeper and
- reports the stack at the time the CAF was evaluated, and it
- may report further stacks until a non-CAF stack is found. In
- the example above, the next stack (after <literal>-->
- evaluated by</literal>) contains plenty of information about
- what the program was doing when it evaluated <literal>head
- []</literal>.</para>
-
- <para>Implementation details aside, the function names in
- the stack should hopefully give you enough clues to track
- down the bug.</para>
-
- <para>
- See also the function <literal>traceStack</literal> in the
- module <literal>Debug.Trace</literal> for another way to
- view call stacks.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-Z</option>
- <indexterm><primary><option>-Z</option></primary><secondary>RTS option</secondary></indexterm>
- </term>
- <listitem>
- <para>Turn <emphasis>off</emphasis> &ldquo;update-frame
- squeezing&rdquo; at garbage-collection time. (There's no
- particularly good reason to turn it off, except to ensure
- the accuracy of certain data collected regarding thunk entry
- counts.)</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- </sect2>
-
- <sect2 id="ghc-info">
- <title>Getting information about the RTS</title>
-
- <indexterm><primary>RTS</primary></indexterm>
-
- <para>It is possible to ask the RTS to give some information about
- itself. To do this, use the <option>--info</option> flag, e.g.</para>
-<screen>
-$ ./a.out +RTS --info
- [("GHC RTS", "YES")
- ,("GHC version", "6.7")
- ,("RTS way", "rts_p")
- ,("Host platform", "x86_64-unknown-linux")
- ,("Host architecture", "x86_64")
- ,("Host OS", "linux")
- ,("Host vendor", "unknown")
- ,("Build platform", "x86_64-unknown-linux")
- ,("Build architecture", "x86_64")
- ,("Build OS", "linux")
- ,("Build vendor", "unknown")
- ,("Target platform", "x86_64-unknown-linux")
- ,("Target architecture", "x86_64")
- ,("Target OS", "linux")
- ,("Target vendor", "unknown")
- ,("Word size", "64")
- ,("Compiler unregisterised", "NO")
- ,("Tables next to code", "YES")
- ]
-</screen>
- <para>The information is formatted such that it can be read as a
- of type <literal>[(String, String)]</literal>. Currently the following
- fields are present:</para>
-
- <variablelist>
-
- <varlistentry>
- <term><literal>GHC RTS</literal></term>
- <listitem>
- <para>Is this program linked against the GHC RTS? (always
- "YES").</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>GHC version</literal></term>
- <listitem>
- <para>The version of GHC used to compile this program.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>RTS way</literal></term>
- <listitem>
- <para>The variant (&ldquo;way&rdquo;) of the runtime. The
- most common values are <literal>rts_v</literal> (vanilla),
- <literal>rts_thr</literal> (threaded runtime, i.e. linked using the
- <literal>-threaded</literal> option) and <literal>rts_p</literal>
- (profiling runtime, i.e. linked using the <literal>-prof</literal>
- option). Other variants include <literal>debug</literal>
- (linked using <literal>-debug</literal>), and
- <literal>dyn</literal> (the RTS is
- linked in dynamically, i.e. a shared library, rather than statically
- linked into the executable itself). These can be combined,
- e.g. you might have <literal>rts_thr_debug_p</literal>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <literal>Target platform</literal>,
- <literal>Target architecture</literal>,
- <literal>Target OS</literal>,
- <literal>Target vendor</literal>
- </term>
- <listitem>
- <para>These are the platform the program is compiled to run on.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <literal>Build platform</literal>,
- <literal>Build architecture</literal>,
- <literal>Build OS</literal>,
- <literal>Build vendor</literal>
- </term>
- <listitem>
- <para>These are the platform where the program was built
- on. (That is, the target platform of GHC itself.) Ordinarily
- this is identical to the target platform. (It could potentially
- be different if cross-compiling.)</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <literal>Host platform</literal>,
- <literal>Host architecture</literal>
- <literal>Host OS</literal>
- <literal>Host vendor</literal>
- </term>
- <listitem>
- <para>These are the platform where GHC itself was compiled.
- Again, this would normally be identical to the build and
- target platforms.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>Word size</literal></term>
- <listitem>
- <para>Either <literal>"32"</literal> or <literal>"64"</literal>,
- reflecting the word size of the target platform.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>Compiler unregistered</literal></term>
- <listitem>
- <para>Was this program compiled with an
- <link linkend="unreg">&ldquo;unregistered&rdquo;</link>
- version of GHC? (I.e., a version of GHC that has no platform-specific
- optimisations compiled in, usually because this is a currently
- unsupported platform.) This value will usually be no, unless you're
- using an experimental build of GHC.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>Tables next to code</literal></term>
- <listitem>
- <para>Putting info tables directly next to entry code is a useful
- performance optimisation that is not available on all platforms.
- This field tells you whether the program has been compiled with
- this optimisation. (Usually yes, except on unusual platforms.)</para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- </sect2>
-</sect1>
-
-<!-- Emacs stuff:
- ;;; Local Variables: ***
- ;;; sgml-parent-document: ("users_guide.xml" "book" "chapter" "sect1") ***
- ;;; ispell-local-dictionary: "british" ***
- ;;; End: ***
- -->