[pve-devel] [RFC qemu-server] use enter_systemd_scope instead of systemd-run

Wolfgang Bumiller w.bumiller at proxmox.com
Fri Jun 3 11:10:01 CEST 2016


With systemd-run qemu's --daemonize forks often happen
before systemd finishes setting up the scopes, which means
the limits we apply often don't work.
We now use enter_systemd_scope() to create the scope before
running qemu directly without systemd-run.

Note that vm_start() runs in a forked-worker or qm cli
command, so entering the scope in such a process should not
affect the rest of the pve daemon.
---
 PVE/QemuServer.pm | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index dd9cea7..d2c2f83 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -2858,20 +2858,6 @@ sub config_to_command {
     my $cpuunits = defined($conf->{cpuunits}) ?
             $conf->{cpuunits} : $defaults->{cpuunits};
 
-    push @$cmd, '/usr/bin/systemd-run';
-    push @$cmd, '--scope';
-    push @$cmd, '--slice', "qemu";
-    push @$cmd, '--unit', $vmid;
-    push @$cmd, '--description', "'Proxmox VE VM $vmid'";
-    # set KillMode=none, so that systemd don't kill those scopes
-    # at shutdown (pve-manager service should stop the VMs instead)
-    push @$cmd, '-p', "KillMode=none";
-    push @$cmd, '-p', "CPUShares=$cpuunits";
-    if ($conf->{cpulimit}) {
-	my $cpulimit = int($conf->{cpulimit} * 100);
-	push @$cmd, '-p', "CPUQuota=$cpulimit\%";
-    }
-
     push @$cmd, '/usr/bin/kvm';
 
     push @$cmd, '-id', $vmid;
@@ -4499,8 +4485,22 @@ sub vm_start {
 	    eval  { run_command($cmd); };
 	}
 
-	eval  { run_command($cmd, timeout => $statefile ? undef : 30,
-		    umask => 0077); };
+	my $cpuunits = defined($conf->{cpuunits}) ? $conf->{cpuunits}
+	                                          : $defaults->{cpuunits};
+
+	eval  {
+	    my %properties = (
+		Slice => 'qemu.slice',
+		KillMode => 'none',
+		CPUShares => $cpuunits
+	    );
+	    if (my $cpulimit = $conf->{cpulimit}) {
+		$properties{CPUQuota} = int($cpulimit * 100);
+	    }
+	    $properties{timeout} = 10 if $statefile; # setting up the scope shoul be quick
+	    PVE::Tools::enter_systemd_scope($vmid, "Proxmox VE VM $vmid", %properties);
+	    run_command($cmd, timeout => $statefile ? undef : 30, umask => 0077);
+	};
 
 	if (my $err = $@) {
 	    # deactivate volumes if start fails
-- 
2.1.4




More information about the pve-devel mailing list