[lxc-devel] [lxd/master] lxd/qemu: Use memory backend ram/file

stgraber on Github lxc-bot at linuxcontainers.org
Fri Jul 3 22:15:23 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 370 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200703/bb92b444/attachment.bin>
-------------- next part --------------
From 0a2d042d1ae876272df16dac5071887a99dd715d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 3 Jul 2020 17:17:55 -0400
Subject: [PATCH] lxd/qemu: Use memory backend ram/file
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #7567

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/instance/drivers/driver_qemu.go           | 82 ++++++++++---------
 lxd/instance/drivers/driver_qemu_templates.go | 20 ++++-
 2 files changed, 63 insertions(+), 39 deletions(-)

diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go
index 0b2c5d13bc..11995dd1e0 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -777,16 +777,6 @@ func (vm *qemu) Start(stateful bool) error {
 		}
 	}
 
-	if shared.IsTrue(vm.expandedConfig["limits.memory.hugepages"]) {
-		hugetlb, err := util.HugepagesPath()
-		if err != nil {
-			op.Done(err)
-			return err
-		}
-
-		qemuCmd = append(qemuCmd, "-mem-path", hugetlb, "-mem-prealloc")
-	}
-
 	if vm.expandedConfig["raw.qemu"] != "" {
 		fields, err := shellquote.Split(vm.expandedConfig["raw.qemu"])
 		if err != nil {
@@ -1590,12 +1580,7 @@ func (vm *qemu) generateQemuConfigFile(busName string, devConfs []*deviceConfig.
 		return "", err
 	}
 
-	err = vm.addCPUConfig(sb)
-	if err != nil {
-		return "", err
-	}
-
-	err = vm.addMemoryConfig(sb)
+	err = vm.addCPUMemoryConfig(sb)
 	if err != nil {
 		return "", err
 	}
@@ -1798,27 +1783,8 @@ func (vm *qemu) generateQemuConfigFile(busName string, devConfs []*deviceConfig.
 	return configPath, ioutil.WriteFile(configPath, []byte(sb.String()), 0640)
 }
 
-// addMemoryConfig adds the qemu config required for setting the size of the VM's memory.
-func (vm *qemu) addMemoryConfig(sb *strings.Builder) error {
-	// Configure memory limit.
-	memSize := vm.expandedConfig["limits.memory"]
-	if memSize == "" {
-		memSize = "1GiB" // Default to 1GiB if no memory limit specified.
-	}
-
-	memSizeBytes, err := units.ParseByteSizeString(memSize)
-	if err != nil {
-		return fmt.Errorf("limits.memory invalid: %v", err)
-	}
-
-	return qemuMemory.Execute(sb, map[string]interface{}{
-		"architecture": vm.architectureName,
-		"memSizeBytes": memSizeBytes,
-	})
-}
-
-// addCPUConfig adds the qemu config required for setting the number of virtualised CPUs.
-func (vm *qemu) addCPUConfig(sb *strings.Builder) error {
+// addCPUMemoryConfig adds the qemu config required for setting the number of virtualised CPUs and memory.
+func (vm *qemu) addCPUMemoryConfig(sb *strings.Builder) error {
 	// Default to a single core.
 	cpus := vm.expandedConfig["limits.cpu"]
 	if cpus == "" {
@@ -1830,6 +1796,7 @@ func (vm *qemu) addCPUConfig(sb *strings.Builder) error {
 	}
 
 	cpuCount, err := strconv.Atoi(cpus)
+	hostNodes := []uint64{}
 	if err == nil {
 		// If not pinning, default to exposing cores.
 		ctx["cpuCount"] = cpuCount
@@ -1863,7 +1830,9 @@ func (vm *qemu) addCPUConfig(sb *strings.Builder) error {
 		numa := []map[string]uint64{}
 		numaIDs := []uint64{}
 		numaNode := uint64(0)
-		for _, entry := range numaNodes {
+		for hostNode, entry := range numaNodes {
+			hostNodes = append(hostNodes, hostNode)
+
 			numaIDs = append(numaIDs, numaNode)
 			for _, vcpu := range entry {
 				numa = append(numa, map[string]uint64{
@@ -1884,8 +1853,45 @@ func (vm *qemu) addCPUConfig(sb *strings.Builder) error {
 		ctx["cpuThreads"] = nrThreads
 		ctx["cpuNumaNodes"] = numaIDs
 		ctx["cpuNumaMapping"] = numa
+		ctx["cpuNumaHostNodes"] = hostNodes
+	}
+
+	// Configure memory limit.
+	memSize := vm.expandedConfig["limits.memory"]
+	if memSize == "" {
+		memSize = "1GiB" // Default to 1GiB if no memory limit specified.
+	}
+
+	memSizeBytes, err := units.ParseByteSizeString(memSize)
+	if err != nil {
+		return fmt.Errorf("limits.memory invalid: %v", err)
+	}
+
+	ctx["hugepages"] = ""
+	if shared.IsTrue(vm.expandedConfig["limits.memory.hugepages"]) {
+		hugetlb, err := util.HugepagesPath()
+		if err != nil {
+			return err
+		}
+
+		ctx["hugepages"] = hugetlb
+	}
+
+	// Determine per-node memory limit.
+	memSizeBytes = memSizeBytes / 1024 / 1024
+	nodeMemory := int64(memSizeBytes / int64(len(hostNodes)))
+	memSizeBytes = nodeMemory * int64(len(hostNodes))
+	ctx["memory"] = nodeMemory
+
+	err = qemuMemory.Execute(sb, map[string]interface{}{
+		"architecture": vm.architectureName,
+		"memSizeBytes": memSizeBytes,
+	})
+	if err != nil {
+		return err
 	}
 
+	// Configure the CPU limit.
 	return qemuCPU.Execute(sb, ctx)
 }
 
diff --git a/lxd/instance/drivers/driver_qemu_templates.go b/lxd/instance/drivers/driver_qemu_templates.go
index ee7943ddd9..41006e9892 100644
--- a/lxd/instance/drivers/driver_qemu_templates.go
+++ b/lxd/instance/drivers/driver_qemu_templates.go
@@ -55,7 +55,7 @@ disable-ticketing = "on"
 var qemuMemory = template.Must(template.New("qemuMemory").Parse(`
 # Memory
 [memory]
-size = "{{.memSizeBytes}}B"
+size = "{{.memSizeBytes}}M"
 `))
 
 var qemuSerial = template.Must(template.New("qemuSerial").Parse(`
@@ -226,10 +226,28 @@ cores = "{{.cpuCores}}"
 threads = "{{.cpuThreads}}"
 
 {{if eq .architecture "x86_64" -}}
+{{$memory := .memory -}}
+{{$hugepages := .hugepages -}}
+{{range $index, $element := .cpuNumaHostNodes}}
+[object "mem{{$index}}"]
+{{if ne $hugepages "" -}}
+qom-type = "memory-backend-file"
+mem-path = "{{$hugepages}}"
+prealloc = "on"
+discard-data = "on"
+{{- else}}
+qom-type = "memory-backend-ram"
+{{- end }}
+size = "{{$memory}}M"
+host-nodes = "{{$element}}"
+policy = "bind"
+{{end}}
+
 {{range $index, $element := .cpuNumaNodes}}
 [numa]
 type = "node"
 nodeid = "{{$element}}"
+memdev = "mem{{$element}}"
 {{end}}
 
 {{range .cpuNumaMapping}}


More information about the lxc-devel mailing list