[elbe-devel] [PATCH v2 1/3] init: add <max-cpus> field and make Makefile.mako obey the <mem> field

Manuel Traut manut at linutronix.de
Fri Oct 19 16:26:35 CEST 2018


On Fri, Sep 28, 2018 at 10:34:18AM +0200, Torben Hohn wrote:
> On machines with many cores, 1GiB of memory is not very much. Especially,
> when g++ is used in a pbuilder with -jauto.
> 
> Add <max-cpus> field, that clamps the number of cpus for the initvm.
> Make it default to 8. Also let the Makefile.mako obey the memory settings.
> 
> Signed-off-by: Torben Hohn <torben.hohn at linutronix.de>
> ---
>  elbepack/init/Makefile.mako    | 13 +++++++++++--
>  elbepack/init/libvirt.xml.mako |  3 ++-
>  elbepack/xmldefaults.py        |  3 ++-
>  schema/dbsfed.xsd              | 11 +++++++++++
>  4 files changed, 26 insertions(+), 4 deletions(-)
> 
> diff --git a/elbepack/init/Makefile.mako b/elbepack/init/Makefile.mako
> index 4c2f323b..6e55056b 100644
> --- a/elbepack/init/Makefile.mako
> +++ b/elbepack/init/Makefile.mako
> @@ -5,8 +5,17 @@
>  ##
>  ## SPDX-License-Identifier: GPL-3.0-or-later
>  ##
> -MEMSIZE?=1024
> -SMP?=`nproc`
> +<%
> +import multiprocessing
> +from elbepack.filesystem import size_to_int
> +
> +cpus = int(prj.text('max-cpus', default=defs, key='max-cpus'))
> +cpus = min(multiprocessing.cpu_count(), cpus)
> +memory = size_to_int(prj.text('mem', default=defs, key='mem')) / 1024 / 1024
> +%>
> +
> +MEMSIZE?=${memory}
> +SMP?=${cpus}
>  INTERPRETER?=${prj.text('interpreter', default=defs, key='interpreter')}

A big adavantage of the Makefile to control the initvm is that it can be
moved easily around and that we can detect the runtime environment during
call-time. This is lost now :(

I'd like to have it implemented directly in the Makefile

The rest of the patch looks OK.

>  # this is a workaround for
> diff --git a/elbepack/init/libvirt.xml.mako b/elbepack/init/libvirt.xml.mako
> index c2b3d077..1260c55f 100644
> --- a/elbepack/init/libvirt.xml.mako
> +++ b/elbepack/init/libvirt.xml.mako
> @@ -19,7 +19,8 @@ from elbepack.filesystem import size_to_int
>  uid = uuid.uuid4()
>  
>  name = cfg['initvm_domain']
> -cpus = multiprocessing.cpu_count()
> +cpus = int(prj.text('max-cpus', default=defs, key='max-cpus'))
> +cpus = min(multiprocessing.cpu_count(), cpus)
>  memory = size_to_int(prj.text('mem', default=defs, key='mem')) / 1024
>  
>  imagetype = prj.text('img', default=defs, key='img')
> diff --git a/elbepack/xmldefaults.py b/elbepack/xmldefaults.py
> index 3a9e8684..dbc93db1 100644
> --- a/elbepack/xmldefaults.py
> +++ b/elbepack/xmldefaults.py
> @@ -142,7 +142,8 @@ archindep_defaults = {
>      "size": "20G",
>      "img": "qcow2",
>      "mem": "1GiB",
> -    "swap-size": "0"
> +    "swap-size": "0",
> +    "max-cpus": "8"
>  }
>  
>  defaults = {"armel": armel_defaults,
> diff --git a/schema/dbsfed.xsd b/schema/dbsfed.xsd
> index eaf707f1..731439db 100644
> --- a/schema/dbsfed.xsd
> +++ b/schema/dbsfed.xsd
> @@ -358,6 +358,17 @@
>            </documentation>
>          </annotation>
>        </element>
> +      <element name="max-cpus" type="integer" minOccurs="0" maxOccurs="1">
> +        <annotation>
> +          <documentation>
> +	    The number of cpus used by the initvm is clamped to this value.
> +	    This shall protect the initvm from running out of memory, when
> +	    running on machines with large numbers of cores.
> +	    When increasing this value, be sure to also increase mem and
> +	    maybe add some swap.
> +          </documentation>
> +        </annotation>
> +      </element>
>        <element name="img" type="rfs:string" minOccurs="0" maxOccurs="1">
>          <annotation>
>            <documentation>
> -- 
> 2.11.0
> 
> 
> _______________________________________________
> elbe-devel mailing list
> elbe-devel at linutronix.de
> https://lists.linutronix.de/mailman/listinfo/elbe-devel



More information about the elbe-devel mailing list