| .. SPDX-License-Identifier: CC-BY-SA-2.0-UK |
| |
| Limiting the Host Resources Usage |
| ********************************* |
| |
| While you sometimes need to :doc:`speed up a build |
| </dev-manual/speeding-up-build>`, you may also need to limit the resources used |
| by the :term:`OpenEmbedded Build System`, especially on shared infrastructures |
| where multiple users start heavy-load builds, or when building on low-power |
| machines. |
| |
| This document aims at giving the different configuration variables available to |
| limit the resources used by the build system. These variables should be set from |
| a :term:`configuration file` and thus take effect over the entire build environment. |
| For each variable, also see the variable description in the glossary for more |
| details. |
| |
| - :term:`BB_NUMBER_THREADS`: |
| |
| This sets a hard limit on the number of threads :term:`BitBake` can run at the |
| same time. Lowering this value will set a limit to the number of |
| :term:`BitBake` threads, but will not prevent a single task from starting more |
| compilation threads (see :term:`PARALLEL_MAKE`). |
| |
| - :term:`BB_NUMBER_PARSE_THREADS`: |
| |
| Like :term:`BB_NUMBER_THREADS`, but this variable sets a limit on the number |
| of threads during the parsing of the environment (before executing tasks). |
| |
| - :term:`PARALLEL_MAKE`: |
| |
| This variable should be set in the form of ``-jN``, where ``N`` is a positive |
| integer. This integer controls the number of threads used when starting |
| ``make``. Note that this variable is not limited to the usage of ``make``, |
| but extends to the compilation (:ref:`ref-tasks-compile` task) commands |
| defined by the :ref:`ref-classes-meson`, :ref:`ref-classes-cmake` and such |
| classes. |
| |
| If you want to have a different limit from the rest of the build for a |
| recipe, it is also possible to achieve with the following line added to your |
| ``local.conf`` :term:`configuration file`:: |
| |
| PARALLEL_MAKE:pn-linux-yocto = "-j4" |
| |
| The above example will limit the number of threads used by ``make`` for the |
| ``linux-yocto`` recipe to 4. |
| |
| - :term:`PARALLEL_MAKEINST`: |
| |
| Like :term:`PARALLEL_MAKE`, but this variable controls the number of threads |
| used during the :ref:`ref-tasks-install` task. |
| |
| The default value of :term:`PARALLEL_MAKEINST` is the value of |
| :term:`PARALLEL_MAKE`. |
| |
| .. note:: |
| |
| While most of the variables in this document help to limit the CPU load, it |
| is also possible that the host system runs out of physical RAM when running |
| builds. This can trigger the out-of-memory killer and stop the related |
| processes abruptly. This can create strange looking failures in the output |
| log of the tasks in question. The out-of-memory killer only logs in the |
| kernel dmesg logs, so it is advised to monitor it closely with the ``dmesg`` |
| command when encountering unexpected failures during builds. |
| |
| In these situations, lowering the value of :term:`PARALLEL_MAKE` and |
| :term:`BB_NUMBER_THREADS` is recommended. |
| |
| - :term:`BB_PRESSURE_MAX_CPU`, :term:`BB_PRESSURE_MAX_IO` and |
| :term:`BB_PRESSURE_MAX_MEMORY`: |
| |
| These variables control the limit of pressure (PSI as defined by |
| https://docs.kernel.org/accounting/psi.html) on the system, and will |
| limit the number of :term:`BitBake` threads dynamically depending on the |
| current pressure of the system. This also means that your host must support |
| the PSI kernel feature (otherwise see :term:`BB_LOADFACTOR_MAX` below). |
| |
| These variables take a positive integer between 1 (extremely low limit) and |
| 1000000 (value unlikely ever reached). Setting an extremely low value, such |
| as 2, is not desirable as it will result in :term:`BitBake` limiting the |
| number of threads to 1 most of the time. |
| |
| To determine a reasonable value to set for your host, follow the steps below: |
| |
| #. In a Bash shell, start the following script, which will provide an |
| estimate of the current pressure on your host: |
| |
| .. code-block:: bash |
| |
| pressure="0" |
| while true; do |
| prev_pressure="$pressure" |
| pressure=$(head -1 /proc/pressure/cpu | cut -d' ' -f5 | cut -d'=' -f2) |
| echo $(( $pressure - $prev_pressure )) |
| sleep 1 |
| done |
| |
| .. note:: |
| |
| Change ``/proc/pressure/cpu`` to ``/proc/pressure/io`` or |
| ``/proc/pressure/memory`` to change the pressure type to monitor. |
| |
| This script can be stopped by pressing Control + C. |
| |
| #. Then, start a heavy-load build, for example:: |
| |
| bitbake virtual/kernel -c compile -f |
| |
| You can stop the build at anytime with Control + C. |
| |
| #. Monitor the values printed on the console. These should indicate how the |
| pressure evolves during the build. You can take a value below the maximum |
| printed value as a starting point. |
| |
| After setting initial values, you can monitor when the pressure exceeds of the |
| limit set by the above variables by running :term:`BitBake` with the |
| ``--verbose`` and ``--log-domains`` flag: |
| |
| .. code-block:: console |
| |
| $ bitbake virtual/kernel -c compile -f --verbose --log-domains BitBake.RunQueue.PSI |
| |
| In parallel, you can monitor the pressure information by tracking the output |
| log file: |
| |
| .. code-block:: console |
| |
| $ tail -F tmp/log/cooker/<machine>/console-latest.log | grep "Pressure status changed" |
| NOTE: Pressure status changed to CPU: False, IO: None, Mem: None (CPU: 1105.9/2.0, IO: 0.0/2.0, Mem: 0.0/2.0) - using 1/64 bitbake threads |
| ... |
| |
| Take a look at the value between parenthesis: ``CPU: 1105.9/2.0, IO: 0.0/2.0, |
| Mem: 0.0/2.0``. They correspond to the current pressure value for the CPU, IO |
| and memory respectively. If :term:`BitBake` prints these messages a lot, it |
| is likely that your pressure limit is too low, and thus can be raised to a |
| higher value. |
| |
| - :term:`BB_LOADFACTOR_MAX`: |
| |
| This variable will limit the number of threads :term:`BitBake` will start |
| by monitoring the current CPU load of the host system. :term:`BitBake` will |
| print the following when the limit set by :term:`BB_LOADFACTOR_MAX` is |
| reached:: |
| |
| Load average limiting set to True as load average: 0.7188262939453125 - using 37/64 bitbake threads |
| |
| This variable has no effect when any of :term:`BB_PRESSURE_MAX_CPU`, |
| :term:`BB_PRESSURE_MAX_IO` or :term:`BB_PRESSURE_MAX_MEMORY` is set, as it |
| was designed for systems that do not have pressure information available. |