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

Torben Hohn torben.hohn at linutronix.de
Thu Nov 22 10:53:05 CET 2018


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 Makefile.mako clamp the SMP default
to the max-cpus value.

Signed-off-by: Torben Hohn <torben.hohn at linutronix.de>
---
 elbepack/init/Makefile.mako    | 12 ++++++++++--
 elbepack/init/libvirt.xml.mako |  3 ++-
 elbepack/xmldefaults.py        |  3 ++-
 schema/dbsfed.xsd              | 11 +++++++++++
 4 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/elbepack/init/Makefile.mako b/elbepack/init/Makefile.mako
index 4c2f323b..8e98176e 100644
--- a/elbepack/init/Makefile.mako
+++ b/elbepack/init/Makefile.mako
@@ -5,8 +5,16 @@
 ##
 ## SPDX-License-Identifier: GPL-3.0-or-later
 ##
-MEMSIZE?=1024
-SMP?=`nproc`
+<%
+import multiprocessing
+from elbepack.filesystem import size_to_int
+
+max_cpus = int(prj.text('max-cpus', default=defs, key='max-cpus'))
+memory = size_to_int(prj.text('mem', default=defs, key='mem')) / 1024 / 1024
+%>
+
+MEMSIZE?=${memory}
+SMP?=$$((`nproc` > ${max_cpus} ? ${max_cpus} : `nproc`))
 INTERPRETER?=${prj.text('interpreter', default=defs, key='interpreter')}
 
 # 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 17aa6283..d52b80f6 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




More information about the elbe-devel mailing list