Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
ptask_BMF: High-level documentation of BMF and the algorithm
[simgrid.git] / docs / source / Configuring_SimGrid.rst
index e7a9685..7b90c7d 100644 (file)
@@ -32,9 +32,9 @@ The most common way is to use the ``--cfg`` command line argument. For
 example, to set the item ``Item`` to the value ``Value``, simply
 type the following on the command-line:
 
-.. code-block:: shell
+.. code-block:: console
 
-   my_simulator --cfg=Item:Value (other arguments)
+   my_simulator --cfg=Item:Value (other arguments)
 
 Several ``--cfg`` command line arguments can naturally be used. If you
 need to include spaces in the argument, don't forget to quote the
@@ -132,6 +132,7 @@ Existing Configuration Items
 - **network/weight-S:** :ref:`cfg=network/weight-S`
 
 - **ns3/TcpModel:** :ref:`options_pls`
+- **ns3/seed:** :ref:`options_pls`
 - **path:** :ref:`cfg=path`
 - **plugin:** :ref:`cfg=plugin`
 
@@ -140,13 +141,17 @@ Existing Configuration Items
 - **surf/precision:** :ref:`cfg=surf/precision`
 
 - **For collective operations of SMPI,** please refer to Section :ref:`cfg=smpi/coll-selector`
+- **smpi/auto-shared-malloc-thresh:** :ref:`cfg=smpi/auto-shared-malloc-thresh`
 - **smpi/async-small-thresh:** :ref:`cfg=smpi/async-small-thresh`
 - **smpi/buffering:** :ref:`cfg=smpi/buffering`
 - **smpi/bw-factor:** :ref:`cfg=smpi/bw-factor`
 - **smpi/coll-selector:** :ref:`cfg=smpi/coll-selector`
 - **smpi/comp-adjustment-file:** :ref:`cfg=smpi/comp-adjustment-file`
 - **smpi/cpu-threshold:** :ref:`cfg=smpi/cpu-threshold`
+- **smpi/display-allocs:** :ref:`cfg=smpi/display-allocs`
 - **smpi/display-timing:** :ref:`cfg=smpi/display-timing`
+- **smpi/errors-are-fatal:** :ref:`cfg=smpi/errors-are-fatal`
+- **smpi/finalization-barrier:** :ref:`cfg=smpi/finalization-barrier`
 - **smpi/grow-injected-times:** :ref:`cfg=smpi/grow-injected-times`
 - **smpi/host-speed:** :ref:`cfg=smpi/host-speed`
 - **smpi/IB-penalty-factors:** :ref:`cfg=smpi/IB-penalty-factors`
@@ -159,6 +164,7 @@ Existing Configuration Items
 - **smpi/or:** :ref:`cfg=smpi/or`
 - **smpi/os:** :ref:`cfg=smpi/os`
 - **smpi/papi-events:** :ref:`cfg=smpi/papi-events`
+- **smpi/pedantic:** :ref:`cfg=smpi/pedantic`
 - **smpi/privatization:** :ref:`cfg=smpi/privatization`
 - **smpi/privatize-libs:** :ref:`cfg=smpi/privatize-libs`
 - **smpi/send-is-detached-thresh:** :ref:`cfg=smpi/send-is-detached-thresh`
@@ -167,6 +173,7 @@ Existing Configuration Items
 - **smpi/simulate-computation:** :ref:`cfg=smpi/simulate-computation`
 - **smpi/test:** :ref:`cfg=smpi/test`
 - **smpi/wtime:** :ref:`cfg=smpi/wtime`
+- **smpi/list-leaks** :ref:`cfg=smpi/list-leaks`
 
 - **Tracing configuration options** can be found in Section :ref:`tracing_tracing_options`
 
@@ -235,8 +242,7 @@ models for all existing resources.
   end, you have two host models: The default one allows aggregation of
   an existing CPU model with an existing network model, but does not
   allow parallel tasks because these beasts need some collaboration
-  between the network and CPU model. That is why, ptask_07 is used by
-  default when using SimDag.
+  between the network and CPU model.
 
   - **default:** Default host model. Currently, CPU:Cas01 and
     network:LV08 (with cross traffic enabled)
@@ -245,6 +251,9 @@ models for all existing resources.
   - **ptask_L07:** Host model somehow similar to Cas01+CM02 but
     allowing "parallel tasks", that are intended to model the moldable
     tasks of the grid scheduling literature.
+  - **ptask_BMF:** More realistic model for heterogeneous resource sharing.
+    Implements BMF (Bottleneck max fairness) fairness. To be used with
+    parallel tasks instead of ptask_L07.
 
 - ``storage/model``: specify the used storage model. Only one model is
   provided so far.
@@ -338,12 +347,11 @@ the TCP congestion mechanism into account.  On Linux, this value can
 be retrieved using the following commands. Both give a set of values,
 and you should use the last one, which is the maximal size.
 
-.. code-block:: shell
+.. code-block:: console
 
-   cat /proc/sys/net/ipv4/tcp_rmem # gives the sender window
-   cat /proc/sys/net/ipv4/tcp_wmem # gives the receiver window
+   cat /proc/sys/net/ipv4/tcp_rmem # gives the sender window
+   cat /proc/sys/net/ipv4/tcp_wmem # gives the receiver window
 
-.. _cfg=smpi/IB-penalty-factors:
 .. _cfg=network/bandwidth-factor:
 .. _cfg=network/latency-factor:
 .. _cfg=network/weight-S:
@@ -359,21 +367,81 @@ one the timings of packet-level simulators, as described in `Accuracy
 Study and Improvement of Network Simulation in the SimGrid Framework
 <http://mescal.imag.fr/membres/arnaud.legrand/articles/simutools09.pdf>`_.
 
+- **network/latency-factor**: apply a multiplier to latency.
+  Models the TCP slow-start mechanism.
+- **network/bandwidth-factor**: actual bandwidth perceived by the
+  user.
+- **network/weight-S**: bottleneck sharing constant parameter. Used
+  to calculate RTT.
+
+These parameters are the same for all communications in your simulation,
+independently of message size or source/destination hosts. A more flexible
+mechanism based on callbacks was introduced in SimGrid. It provides the user
+a callback that will be called for each communication, allowing the user
+to set different latency and bandwidth factors, based on the message size, links used
+or zones traversed. To more details of how to use it, please look at the
+`examples/cpp/network-factors/s4u-network-factors.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/cpp/network-factors/s4u-network-factors.cpp>`_.
+
 
 If you are using the SMPI model, these correction coefficients are
 themselves corrected by constant values depending on the size of the
 exchange.  By default SMPI uses factors computed on the Stampede
 Supercomputer at TACC, with optimal deployment of processes on
 nodes. Again, only hardcore experts should bother about this fact.
+For more details, see SMPI sections about :ref:`cfg=smpi/bw-factor` and :ref:`cfg=smpi/lat-factor`.
+
+
+.. _cfg=smpi/IB-penalty-factors:
+
+Infiniband model
+^^^^^^^^^^^^^^^^
 
 InfiniBand network behavior can be modeled through 3 parameters
 ``smpi/IB-penalty-factors:"βe;βs;γs"``, as explained in `this PhD
 thesis
-<http://mescal.imag.fr/membres/jean-marc.vincent/index.html/PhD/Vienne.pdf>`_.
+<http://mescal.imag.fr/membres/jean-marc.vincent/index.html/PhD/Vienne.pdf>`_ (in French)
+or more concisely in `this paper <https://hal.inria.fr/hal-00953618/document>`_,
+even if that paper does only describe models for myrinet and ethernet.
+You can see in Fig 2 some results for Infiniband, for example. This model
+may be outdated by now for modern infiniband, anyway, so a new
+validation would be good.
+
+The three paramaters are defined as follows:
+
+- βs: penalty factor for outgoing messages, computed by running a simple send to
+  two nodes and checking slowdown compared to a single send to one node,
+  dividing by 2
+- βe: penalty factor for ingoing messages, same computation method but with one
+  node receiving several messages
+- γr: slowdown factor when communication buffer memory is saturated. It needs a
+  more complicated pattern to run in order to be computed (5.3 in the thesis,
+  page 107), and formula in the end is γr = time(c)/(3×βe×time(ref)), where
+  time(ref) is the time of a single comm with no contention).
+
+Once these values are computed, a penalty is assessed for each message (this is
+the part implemented in the simulator) as shown page 106 of the thesis. Here is
+a simple translation of this text. First, some notations:
+
+- ∆e(e) which corresponds to the incoming degree of node e, that is to say the number of communications having as destination node e.
+- ∆s (s) which corresponds to the degree outgoing from node s, that is to say the number of communications sent by node s.
+- Φ (e) which corresponds to the number of communications destined for the node e but coming from a different node.
+- Ω (s, e) which corresponds to the number of messages coming from node s to node e. If node e only receives communications from different nodes then Φ (e) = ∆e (e). On the other hand if, for example, there are three messages coming from node s and going from node e then Φ (e) 6 = ∆e (e) and Ω (s, e) = 3
 
-.. todo:: This section should be rewritten, and actually explain the
-         options network/bandwidth-factor, network/latency-factor,
-         network/weight-S.
+To determine the penalty for a communication, two values need to be calculated. First, the penalty caused by the conflict in transmission, noted ps.
+
+
+- if ∆s (i) = 1 then ps = 1.
+- if ∆s (i) ≥ 2 and ∆e (i) ≥ 3 then ps = ∆s (i) × βs × γr
+- else, ps = ∆s (i) × βs
+
+
+Then,  the penalty caused by the conflict in reception (noted pe) should be computed as follows:
+
+- if ∆e (i) = 1 then pe = 1
+- else, pe = Φ (e) × βe × Ω (s, e)
+
+Finally, the penalty associated with the communication is:
+p = max (ps ∈ s, pe)
 
 .. _cfg=network/crosstraffic:
 
@@ -401,9 +469,9 @@ Note that with the default host model this option is activated by default.
 Configuring loopback link
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
-Several network model provide an implicit loopback link to account for local 
+Several network model provide an implicit loopback link to account for local
 communication on a host. By default it has a 10GBps bandwidth and a null latency.
-This can be changed with ``network/loopback-lat`` and ``network/loopback-bw`` 
+This can be changed with ``network/loopback-lat`` and ``network/loopback-bw``
 items.
 
 .. _cfg=smpi/async-small-thresh:
@@ -439,6 +507,15 @@ ns-3. The only valid values (enforced on the SimGrid side) are
 'default' (no change to the ns-3 configuration), 'NewReno' or 'Reno' or
 'Tahoe'.
 
+**Option** ``ns3/seed`` **Default:** "" (don't set the seed in ns-3)
+
+This option is the random seed to provide to ns-3 with
+``ns3::RngSeedManager::SetSeed`` and ``ns3::RngSeedManager::SetRun``.
+
+If left blank, no seed is set in ns-3. If the value 'time' is
+provided, the current amount of seconds since epoch is used as a seed.
+Otherwise, the provided value must be a number to use as a seed.
+
 Configuring the Storage model
 .............................
 
@@ -487,9 +564,9 @@ Configuring the Model-Checking
 To enable SimGrid's model-checking support, the program should
 be executed using the simgrid-mc wrapper:
 
-.. code-block:: shell
+.. code-block:: console
 
-   simgrid-mc ./my_program
+   simgrid-mc ./my_program
 
 Safety properties are expressed as assertions using the function
 :cpp:func:`void MC_assert(int prop)`.
@@ -532,9 +609,9 @@ the command line, specifying the name of the file containing the
 property, as formatted by the `ltl2ba <https://github.com/utwente-fmt/ltl2ba>`_ program.
 Note that ltl2ba is not part of SimGrid and must be installed separately.
 
-.. code-block:: shell
+.. code-block:: console
 
-   simgrid-mc ./my_program --cfg=model-check/property:<filename>
+   simgrid-mc ./my_program --cfg=model-check/property:<filename>
 
 .. _cfg=model-check/checkpoint:
 
@@ -626,18 +703,18 @@ If set, the ``model-check/dot-output`` configuration item is the name
 of a file in which to write a dot file of the path leading to the
 property violation discovered (safety or liveness violation), as well
 as the cycle for liveness properties. This dot file can then be fed to the
-graphviz dot tool to generate an corresponding graphical representation.
+graphviz dot tool to generate a corresponding graphical representation.
 
 .. _cfg=model-check/max-depth:
 
 Exploration Depth Limit
 .......................
 
-The ``model-checker/max-depth`` can set the maximum depth of the
+The ``model-check/max-depth`` can set the maximum depth of the
 exploration graph of the model checker. If this limit is reached, a
 logging message is sent and the results might not be exact.
 
-By default, there is no depth limit.
+By default, the exploration is limited to the depth of 1000.
 
 .. _cfg=model-check/timeout:
 
@@ -694,7 +771,7 @@ When the model checker finds an interesting path in the application
 execution graph (where a safety or liveness property is violated), it
 generates an identifier for this path. Here is an example of the output:
 
-.. code-block:: shell
+.. code-block:: console
 
    [  0.000000] (0:@) Check a safety property
    [  0.000000] (0:@) **************************
@@ -722,7 +799,8 @@ the form ``X/a;Y/b``, the X and Y are the selected pids while the a
 and b are the return values of their simcalls. In the previous
 example, ``1/3;1/4``, you can see from the full output that the actor
 1 is doing MC_RANDOM simcalls, so the 3 and 4 simply denote the values
-that these simcall return.
+that these simcall return on the execution branch leading to the
+violation.
 
 Configuring the User Code Virtualization
 ----------------------------------------
@@ -795,7 +873,7 @@ want to reduce the ``contexts/stack-size`` item. Its default value is
 8192 (in KiB), while our Chord simulation works with stacks as small
 as 16 KiB, for example. You can ensure that some actors have a specific
 size by simply changing the value of this configuration item before
-creating these actors. The :cpp:func:`simgrid::s4u::Engine::set_config` 
+creating these actors. The :cpp:func:`simgrid::s4u::Engine::set_config`
 functions are handy for that.
 
 This *setting is ignored* when using the thread factory (because there
@@ -866,20 +944,20 @@ which value is either:
 Configuring the Tracing
 -----------------------
 
-The :ref:`tracing subsystem <outcomes_vizu>` can be configured in
-several different ways depending on the nature of the simulator (MSG,
-SimDag, SMPI) and the kind of traces that need to be obtained. See the
+The :ref:`tracing subsystem <outcome_vizu>` can be configured in
+several different ways depending on the used interface (S4U, SMPI)
+and the kind of traces that needs to be obtained. See the
 :ref:`Tracing Configuration Options subsection
-<tracing_tracing_options>` to get a detailed description of each
+<tracing_tracing_options>` for a full description of each
 configuration option.
 
 We detail here a simple way to get the traces working for you, even if
 you never used the tracing API.
 
 
-- Any SimGrid-based simulator (MSG, SimDag, SMPI, ...) and raw traces:
+- Any SimGrid-based simulator (MSG, SMPI, ...) and raw traces:
 
-  .. code-block:: shell
+  .. code-block:: none
 
      --cfg=tracing:yes --cfg=tracing/uncategorized:yes
 
@@ -887,10 +965,10 @@ you never used the tracing API.
   tells it to trace host and link utilization (without any
   categorization).
 
-- MSG or SimDag-based simulator and categorized traces (you need to
-  declare categories and classify your tasks according to them) 
+- MSG-based simulator and categorized traces (you need to
+  declare categories and classify your tasks according to them)
 
-  .. code-block:: shell
+  .. code-block:: none
 
      --cfg=tracing:yes --cfg=tracing/categorized:yes
 
@@ -899,9 +977,9 @@ you never used the tracing API.
 
 - SMPI simulator and traces for a space/time view:
 
-  .. code-block:: shell
+  .. code-block:: console
 
-     smpirun -trace ...
+     smpirun -trace ...
 
   The `-trace` parameter for the smpirun script runs the simulation
   with ``--cfg=tracing:yes --cfg=tracing/smpi:yes``. Check the
@@ -913,13 +991,13 @@ reproduce an experiment. You have two ways to do that:
 
 - Add a string on top of the trace file as comment:
 
-  .. code-block:: shell
+  .. code-block:: none
 
      --cfg=tracing/comment:my_simulation_identifier
 
 - Add the contents of a textual file on top of the trace file as comment:
 
-  .. code-block:: shell
+  .. code-block:: none
 
      --cfg=tracing/comment-file:my_file_with_additional_information.txt
 
@@ -1026,7 +1104,7 @@ This option allows you to pass a file that contains two columns: The
 first column defines the section that will be subject to a speedup;
 the second column is the speedup. For instance:
 
-.. code-block:: shell
+.. code-block:: none
 
   "start:stop","ratio"
   "exchange_1.f:30:exchange_1.f:130",1.18244559422142
@@ -1081,6 +1159,23 @@ code, making it difficult to report the simulated time when the
 simulation ends. If you enable the ``smpi/display-timing`` item,
 ``smpirun`` will display this information when the simulation
 ends.
+SMPI will also display information about the amout of real time spent
+in application code and in SMPI internals, to provide hints about the
+need to use sampling to reduce simulation time.
+
+.. _cfg=smpi/display-allocs:
+
+Reporting memory allocations
+............................
+
+**Option** ``smpi/display-allocs`` **Default:** 0 (false)
+
+SMPI intercepts malloc and calloc calls performed inside the running
+application, if it wasn't compiled with SMPI_NO_OVERRIDE_MALLOC.
+With this option, SMPI will show at the end of execution the amount of
+memory allocated through these calls, and locate the most expensive one.
+This helps finding the targets for manual memory sharing, or the threshold
+to use for smpi/auto-shared-malloc-thresh option (see :ref:`cfg=smpi/auto-shared-malloc-thresh`).
 
 .. _cfg=smpi/keep-temps:
 
@@ -1134,7 +1229,7 @@ It is planned to make this feature available on a per-process (or per-thread?) b
 The first draft, however, just implements a "global" (i.e., for all processes) set
 of counters, the "default" set.
 
-.. code-block:: shell
+.. code-block:: none
 
    --cfg=smpi/papi-events:"default:PAPI_L3_LDM:PAPI_L2_LDM"
 
@@ -1185,9 +1280,9 @@ This configuration option can only use either full paths to libraries,
 or full names.  Check with ldd the name of the library you want to
 use.  For example:
 
-.. code-block:: shell
+.. code-block:: console
 
-   ldd allpairf90
+   ldd allpairf90
       ...
       libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007fbb4d91b000)
       ...
@@ -1230,6 +1325,49 @@ Each collective operation can be manually selected with a
 .. TODO:: All available collective algorithms will be made available
           via the ``smpirun --help-coll`` command.
 
+.. _cfg=smpi/finalization-barrier:
+
+Add a barrier in MPI_Finalize
+.............................
+
+**Option** ``smpi/finalization-barrier`` **default:** off
+
+By default, SMPI processes are destroyed as soon as soon as their code ends,
+so after a successful MPI_Finalize call returns. In some rare cases, some data
+might have been attached to MPI objects still active in the remaining processes,
+and can be destroyed eagerly by the finished process.
+If your code shows issues at finalization, such as segmentation fault, triggering
+this option will add an explicit MPI_Barrier(MPI_COMM_WORLD) call inside the
+MPI_Finalize, so that all processes will terminate at almost the same point.
+It might affect the total timing by the cost of a barrier.
+
+.. _cfg=smpi/errors-are-fatal:
+
+Disable MPI fatal errors
+........................
+
+**Option** ``smpi/errors-are-fatal`` **default:** on
+
+By default, SMPI processes will crash if a MPI error code is returned. MPI allows
+to explicitely set MPI_ERRORS_RETURN errhandler to avoid this behaviour. This flag
+will turn on this behaviour by default (for all concerned types and errhandlers).
+This can ease debugging by going after the first reported error.
+
+.. _cfg=smpi/pedantic:
+
+Disable pedantic MPI errors
+...........................
+
+**Option** ``smpi/pedantic`` **default:** on
+
+By default, SMPI will report all errors it finds in MPI codes. Some of these errors
+may not be considered as errors by all developers. This flag can be turned off to
+avoid reporting some usually harmless mistakes.
+Concerned errors list (will be expanded in the future):
+
+ - Calling MPI_Win_fence only once in a program, hence just opening an epoch without
+   ever closing it.
+
 .. _cfg=smpi/iprobe:
 
 Inject constant times for MPI_Iprobe
@@ -1380,7 +1518,7 @@ of the SMPI CourseWare (see Activity #2.2 of the pointed
 assignment). In practice, change the calls for malloc() and free() into
 SMPI_SHARED_MALLOC() and SMPI_SHARED_FREE().
 
-SMPI provides two algorithms for this feature. The first one, called 
+SMPI provides two algorithms for this feature. The first one, called
 ``local``, allocates one block per call to SMPI_SHARED_MALLOC()
 (each call site gets its own block) ,and this block is shared
 among all MPI ranks.  This is implemented with the shm_* functions
@@ -1417,16 +1555,34 @@ entry per MB of malloced data instead of one entry per 4 kB.
 To activate this, you must mount a hugetlbfs on your system and allocate
 at least one huge page:
 
-.. code-block:: shell
+.. code-block:: console
 
-    mkdir /home/huge
-    sudo mount none /home/huge -t hugetlbfs -o rw,mode=0777
-    sudo sh -c 'echo 1 > /proc/sys/vm/nr_hugepages' # echo more if you need more
+    mkdir /home/huge
+    sudo mount none /home/huge -t hugetlbfs -o rw,mode=0777
+    sudo sh -c 'echo 1 > /proc/sys/vm/nr_hugepages' # echo more if you need more
 
 Then, you can pass the option
 ``--cfg=smpi/shared-malloc-hugepage:/home/huge`` to smpirun to
 actually activate the huge page support in shared mallocs.
 
+.. _cfg=smpi/auto-shared-malloc-thresh:
+
+Automatically share allocations
+...............................
+
+**Option** ``smpi/auto-shared-malloc-thresh:`` **Default:** 0 (false)
+   This value in bytes represents the size above which all allocations
+   will be "shared" by default (as if they were performed through
+   SMPI_SHARED_MALLOC macros). Default = 0 = disabled feature.
+   The value must be carefully chosen to only select data buffers which
+   will not modify execution path or cause crash if their content is false.
+   Option :ref:`cfg=smpi/display-allocs` can be used to locate the largest
+   allocation detected in a run, and provide a good starting threshold.
+   Note : malloc, calloc and free are overridden by smpicc/cxx by default.
+   This can cause some troubles if codes are already overriding these. If this
+   is the case, defining SMPI_NO_OVERRIDE_MALLOC in the compilation flags can
+   help, but will make this feature unusable.
+
 .. _cfg=smpi/wtime:
 
 Inject constant times for MPI_Wtime, gettimeofday and clock_gettime
@@ -1458,6 +1614,16 @@ to be broken out of and reset each time your code asks for the current time.
 If the simulation speed really matters to you, you can avoid this
 extra delay by setting smpi/wtime to 0.
 
+.. _cfg=smpi/list-leaks:
+
+Report leaked MPI objects
+.........................
+
+**Option** ``smpi/list-leaks`` **default:** 0
+
+This option controls whether to report leaked MPI objects.
+The parameter is the number of leaks to report.
+
 Other Configurations
 --------------------
 
@@ -1500,7 +1666,7 @@ It is also possible to set the breakpoint from inside the debugger, by
 writing in global variable simgrid::simix::breakpoint. For example,
 with gdb:
 
-.. code-block:: shell
+.. code-block:: none
 
    set variable simgrid::simix::breakpoint = 3.1416
 
@@ -1530,10 +1696,122 @@ the tests: the full file path would makes the tests non-reproducible because
 the paths of source files depend of the build settings. That would
 break most of the tests since their output is continually compared.
 
-Logging Configuration
+.. _logging_config:
+
+Logging configuration
 ---------------------
 
-This can be done by using XBT. Go to :ref:`XBT_log` for more details.
+As introduced in :ref:`outcome_logs`, the SimGrid logging mechanism allows to configure at runtime the messages that should be displayed and those that should be omitted. Each
+message produced in the code is given a category (denoting its topic) and a priority. Then at runtime, each category is given a threshold (only messages of priority higher than
+that threshold are displayed), a layout (deciding how the messages in this category are formatted), and an appender (deciding what to do with the message: either print on stderr or
+to a file).
+
+This section explains how to configure this logging features. You can also refer to the documentation of the :ref:`programmer's interface <logging_prog>`, that allows to produce
+messages from your code.
+
+Most of the time, the logging mechanism is configured at runtime using the ``--log`` command-line argument, even if you can also use :c:func:`xbt_log_control_set()` to control it from
+your program. To pass configure more than one setting, you can either pass several ``--log`` arguments, or separate your settings with spaces, that must be quoted accordingly. In
+practice, the following is equivalent to the above settings: ``--log=root.thresh:error --log=s4u_host.thresh:debug``.
+
+If you want to specify more than one setting, you can either pass several ``--log`` argument to your program as above, or separate them with spaces. In this case, you want to quote
+your settings, as in ``--log="root.thresh:error s4u_host.thresh:debug"``. The parameters are interpreted in order, from left to right.
+
+
+Threshold configuration
+.......................
+
+The keyword ``threshold`` controls which logging event will get displayed in a given category. For example, ``--log=root.threshold:debug`` displays *every* message produced in the
+``root`` category and its subcategories (i.e., every message produced -- this is *extremely* verbose), while ``--log=root.thres:critical`` turns almost everything off. As you can
+see, ``threshold`` can be abbreviated here.
+
+Existing thresholds:
+
+ - ``trace`` some functions display a message at this level when entering or returning
+ - ``debug`` output that is mostly useful when debugging the corresponding module.
+ - ``verbose`` verbose output that is only mildly interesting and can easily be ignored
+ - ``info`` usual output (this is the default threshold of all categories)
+ - ``warning`` minor issue encountered
+ - ``error`` issue encountered
+ - ``critical`` major issue encountered, such as assertions failures
+
+.. _log/fmt:
+
+Format configuration
+....................
+
+The keyword ``fmt`` controls the layout (the format) of a logging category. For example, ``--log=root.fmt:%m`` reduces the output to the user-message only, removing any decoration such
+as the date, or the actor ID, everything. Existing format directives:
+
+ - %%: the % char
+ - %n: line separator (LOG4J compatible)
+ - %e: plain old space (SimGrid extension)
+
+ - %m: user-provided message
+
+ - %c: Category name (LOG4J compatible)
+ - %p: Priority name (LOG4J compatible)
+
+ - %h: Hostname (SimGrid extension)
+ - %a: Actor name (SimGrid extension -- note that with SMPI this is the integer value of the process rank)
+ - %i: Actor PID (SimGrid extension -- this is a 'i' as in 'i'dea)
+ - %t: Thread "name" (LOG4J compatible -- actually the address of the thread in memory)
+
+ - %F: file name where the log event was raised (LOG4J compatible)
+ - %l: location where the log event was raised (LOG4J compatible, like '%%F:%%L' -- this is a l as in 'l'etter)
+ - %L: line number where the log event was raised (LOG4J compatible)
+ - %M: function name (LOG4J compatible -- called method name here of course).
+
+ - %d: date (UNIX-like epoch)
+ - %r: application age (time elapsed since the beginning of the application)
+
+
+``--log=root.fmt:'[%h:%a:(%i) %r] %l: %m%n'`` gives you the default layout used for info messages while ``--log=root.fmt:'[%h:%a:(%i) %r] %l: [%c/%p] %m%n'`` gives you the default
+layout for the other priorities (it adds the source code location). Also, the actor identification is omitted by the default layout for the messages coming directly from the
+SimGrid kernel, so info messages are formatted with ``[%r] [%c/%p] %m%n`` in this case. When specifying the layout manually, such distinctions are currently impossible, and the
+provided layout is used for every messages.
+
+As with printf, you can specify the precision and width of the fields. For example, ``%.4r`` limits the date precision to four digits while ``%15h`` limits the host name to at most
+15 chars.
+
+
+If you want to have spaces in your log format, you should protect it. Otherwise, SimGrid will consider that this is a space-separated list of several parameters. But you should
+also protect it from the shell that also splits command line arguments on spaces. At the end, you should use something such as ``--log="'root.fmt:%l: [%p/%c]: %m%n'"``.
+Another option is to use the ``%e`` directive for spaces, as in ``--log=root.fmt:%l:%e[%p/%c]:%e%m%n``.
+
+Category appender
+.................
+
+The keyword ``app`` controls the appended of a logging category. For example ``--log=root.app:file:mylogfile`` redirects every output to the file ``mylogfile``.
+
+With the ``splitfile`` appender, a new file is created when the size of the output reaches the specified size. The format is ``--log=root.app:splitfile:<size>:<file name>``. For
+example, ``--log=root.app:splitfile:500:mylog_%`` creates log files of at most 500 bytes, using the names ``mylog_0``, ``mylog_1``, ``mylog_2``, etc.
+
+The ``rollfile`` appender uses one file only, but the file is emptied and recreated when its size reaches the specified maximum. For example, ``--log=root.app:rollfile:500:mylog``
+ensures that the log file ``mylog`` will never overpass 500 bytes in size.
+
+Any appender setup this way have its own layout format, that you may change afterward. When specifying a new appender, its additivity is set to false to prevent log event displayed
+by this appender to "leak" to any other appender higher in the hierarchy. You can naturally change that if you want your messages to be displayed twice.
+
+Category additivity
+...................
+
+The keyword ``add`` controls the additivity of a logging category. By default, the messages are only passed one appender only: the more specific, i.e. the first one found when
+climbing the tree from the category in which they were produced. In Log4J parlance, it is said that the default additivity of appenders is false. If you change this setting to
+``on`` (or ``yes`` or ``1``), the produced messages will also be passed to the upper appender.
+
+Let's consider a more complex example: ``--log="root.app:file:all.log s4u.app:file:iface.log xbt.app:file:xbt.log xbt.add:yes``. Here, the logging of s4u will be sent to the
+``iface.log`` file; the logging of the xbt toolbox will be sent to both the ``xbt.log`` file and the ``all.log`` file (because xbt additivity was enabled); and every other loggings
+will only be sent to ``all.log``.
+
+Other options
+.............
+
+``--help-logs`` displays a complete help message about logging in SimGrid.
+
+``--help-log-categories`` displays the actual hierarchy of log categories for this binary.
+
+``--log=no_loc`` hides the source locations (file names and line numbers) from the messages. This is useful to make tests reproducible.
+
 
 .. |br| raw:: html