From 8e59d952be9bc5cdf17f9c364444149840c23097 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Fri, 3 Jun 2016 11:10:01 +0200 Subject: [PATCH] use enter_systemd_scope instead of systemd-run 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 2da9208c..9c1dd568 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -2730,20 +2730,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; @@ -4346,8 +4332,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